关于python的全局变量和局部变量、以下描述错误的是_Python:全局变量与局部变量的问题...
在Python中,如果處理不好變量使用的關(guān)系,就很容易出現(xiàn):
UnboundLocalError: local variable 'n' referenced before assignment
這種錯(cuò)誤。
一般而言,這種錯(cuò)誤都是這么出現(xiàn)的:
n = 1
def test():
n += 1
print(n)
if __name__ == '__main__':
test()
原因很簡(jiǎn)單:在代碼尚未執(zhí)行時(shí),當(dāng)某個(gè)函數(shù)(作用域)內(nèi),對(duì)某個(gè)外部變量進(jìn)行了處理,而使其值改變,則Python會(huì)認(rèn)為操作的變量是局部變量;在代碼運(yùn)行時(shí),對(duì)于這個(gè)Python自己聲明的沒(méi)有實(shí)際值的局部變量,直接對(duì)其進(jìn)行操作就會(huì)出現(xiàn)錯(cuò)誤。
說(shuō)的很繞,用例子來(lái)說(shuō)明吧。
這樣是正常情況:
n = 1
def test():
print(n)
if __name__ == '__main__':
test()
因?yàn)閠est()函數(shù)中,沒(méi)有對(duì)n的值進(jìn)行改變,所以在test()中,n仍然是全局變量n。
但這樣就有問(wèn)題了:
n = 1
def test():
n += 1
print(n)
if __name__ == '__main__':
test()
錯(cuò)誤如下:
Traceback (most recent call last):
File "C:\Users\zhantong\Desktop\test.py", line 9, in
test()
File "C:\Users\zhantong\Desktop\test.py", line 5, in test
n += 1
UnboundLocalError: local variable 'n' referenced before assignment
這是因?yàn)镻ython發(fā)現(xiàn)了test()函數(shù)對(duì)n的值進(jìn)行了改變,所以此時(shí)n是局部變量,但n沒(méi)有值,自然就出錯(cuò)了。
有一個(gè)細(xì)節(jié):
n = 1
def test():
print(n)
n += 1
print(n)
if __name__ == '__main__':
test()
這時(shí)出現(xiàn)的錯(cuò)誤:
Traceback (most recent call last):
File "C:\Users\zhantong\Desktop\test.py", line 10, in
test()
File "C:\Users\zhantong\Desktop\test.py", line 5, in test
print(n)
UnboundLocalError: local variable 'n' referenced before assignment
區(qū)別于上面的情況,這時(shí)是test()函數(shù)中,第一個(gè)print()出錯(cuò),充分說(shuō)明Python在test()實(shí)際運(yùn)行前,即已聲明n為局部變量。
解決的辦法很容易,用global聲明,防止Python自行處理:
n = 1
def test():
global n
print(n)
n += 1
print(n)
if __name__ == '__main__':
test()
得到的結(jié)果:
1
2
這里還有一點(diǎn)需要注意,list和dict類型并不受上述問(wèn)題影響
直接用代碼說(shuō)明吧,list:
l = [1, 2, 3]
def test():
print(l)
l[0] += 1
print(l)
if __name__ == '__main__':
test()
結(jié)果:
[1, 2, 3]
[2, 2, 3]
dict也是類似的:
d = {
'a': 1,
'b': 2,
}
def test():
print(d)
d['a'] += 1
print(d)
if __name__ == '__main__':
test()
結(jié)果:
{'a': 1, 'b': 2}
{'a': 2, 'b': 2}
綜上,在操作一般變量時(shí),需要考慮全局變量與局部變量的關(guān)系,采取的解決方法是傳參或者global聲明;在操作list、dict等對(duì)象時(shí),雖然不需要考慮這些問(wèn)題,但一定要注意可能的不小心修改了其值。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的关于python的全局变量和局部变量、以下描述错误的是_Python:全局变量与局部变量的问题...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2023中国家电健康趋势高峰论坛在京召开
- 下一篇: 钉钉AI魔法棒上线,17项产品、60+场