[英]Scope of lists in Python 3
這可能是一個非常愚蠢的問題,但我有點不確定為什么列表在范圍方面與Python 3中的其他變量的行為不同。 在以下代碼中......
foo = 1
bar = [1,2,3,4]
def baz():
foo += 1
bar[0]+=1
我理解為什么foo += 1
會引發關於foo
超出局部范圍的錯誤。 為什么bar[0]+=1
不會拋出相同的錯誤?
變量foo
指向一個對象(一個整數)。 變量baz
指向一個對象(一個列表)。 如果您嘗試將baz
重新分配給另一個對象,則會出現錯誤。 但你不是,你只是在列表對象上調用一個方法,任何人都可以這樣做。
在python中,如果沒有'global'關鍵字,則無法修改全局變量。 這是為了清楚起見。
foo=1
def bar():
global foo
foo=2
bar()
#foo is now 2!
由於bar [0] + = foo修改了列表的元素,而不是列表變量本身的值,因此它是合法的。
當你執行代碼時,你會得到
....
foo += 1
UnboundLocalError: local variable 'foo' referenced before assignment
foo += 1
實際上是這樣評估的。 foo = foo + 1
。 因此,您將foo
的值加1
並將其存儲在變量foo
。 由於發生了賦值,Python假定foo
是局部變量。 但是,如果它是局部變量,在表達式foo + 1
, foo
的值是多少? Python無法回答這個問題。 這就是它拋出錯誤的原因。
但是,當你執行bar[0] += 1
,Python會像這個bar[0] = bar[0] + 1
一樣評估它。 因為它已經知道了什么是bar
,你只是想要替換它中的第一個元素,它允許它。 在最后一種情況下,我們通過執行foo += 1
來創建一個名為foo
的新局部變量,但在這里,我們只是改變了同一個對象。 所以Python允許這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.