簡體   English   中英

Python 3中的列表范圍

[英]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 + 1foo的值是多少? Python無法回答這個問題。 這就是它拋出錯誤的原因。

但是,當你執行bar[0] += 1 ,Python會像這個bar[0] = bar[0] + 1一樣評估它。 因為它已經知道了什么是bar ,你只是想要替換它中的第一個元素,它允許它。 在最后一種情況下,我們通過執行foo += 1來創建一個名為foo的新局部變量,但在這里,我們只是改變了同一個對象。 所以Python允許這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM