簡體   English   中英

Python 奇怪的東西與列表本地和全局 scope

[英]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.

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