[英]Python weird thing with list local and global scope
為什么我們可以使用append 方法修改列表,但不能對列表連接做同樣的事情? 我知道本地和全球 scope,我很困惑為什么我們可以用 append 方法來做到這一點,在此先感謝
some_list=[]
def foo():
some_list.append('apple')
foo()
print(some_list)
#it works
使用列表連接
some_list=[]
def foo():
some_list+=['apple']
foo()
print(some_list)
#UnboundLocalError: local variable 'some_list' referenced before assignment
像+=
這樣的增強操作重新分配原始變量,即使它不是絕對必要的。
Python 的運算符變成了對對象魔術方法的調用: __iadd__
for +=
。 像int
這樣的不可變對象不能改變自己,所以你不能像在 C 中那樣就地+=
。 相反,python 的增強方法返回 object 以重新分配給正在操作的變量。 像列表這樣的可變對象只會返回自己,而不可變對象會返回不同的 object。
由於正在重新分配變量,因此它必須遵循與任何其他變量相同的范圍規則。 重新分配導致 python 假設變量位於本地命名空間中,您需要global
關鍵字來覆蓋該假設。
局部和全局范圍適用於變量本身,特別是它所引用的 object。 該變量僅指向 memory 中的 object。 您不能在不同的本地 scope 中更改變量的“指針”,但可以更改它指向的 object。 在這里,您可以使用append
,因為它會更改列表 object 本身,即存儲在 memory 中的列表。 它不會改變變量some_list
指向的內容。 另一方面,在第二個示例中,您嘗試重新分配some_list
以引用與舊列表組合創建的新列表。 由於這不可能發生,解釋器現在將此some_list
視為一個局部變量,與另一個全局變量分開
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.