[英]Can someone please explain this bit of Python code?
我最近剛開始使用Python,並沒有充分了解它的所有細節,但最近我發現這篇文章解釋了為什么python有閉包,在那里,有一個示例代碼如下:
y = 0
def foo():
x = [0]
def bar():
print x[0], y
def change(z):
global y
x[0] = y = z
change(1)
bar()
change(2)
bar()
change(3)
bar()
change(4)
bar()
foo()
1 1
2 2
3 3
基本上我不明白它是如何工作的,在這種情況下,x [0]的構造是什么,或者實際上我理解它在做什么,我只是不知道它是怎么回事:)
在Python 3中添加nonlocal
關鍵字之前(現在仍然存在,如果你因為某種原因而被卡在2.*
),嵌套函數就無法重新綁定其外部函數的本地簡稱 - 因為,通常,賦值語句到一個簡單名稱,例如x = 23
,表示x
是包含該語句的函數的本地名稱。 global
存在(並且已經存在了很長時間)以允許賦值綁定或重新綁定模塊級別的名字 - 但沒有任何內容(除了Python 3中的nonlocal
,正如我所說)允許賦值綁定或重新綁定外部函數中的名稱。
解決方案當然非常簡單:由於您無法綁定或重新綁定此類名稱,因此請使用非裸名稱 - 外部函數中指定的某個對象的索引或屬性。 當然,所述對象必須是允許重新綁定索引(例如,列表)的類型,或者允許綁定或重新綁定屬性的類型(例如,函數),並且列表通常是最簡單和最直接的這個方法。 x
正是此代碼示例中的列表 - 它只是為了讓嵌套函數change
重新綁定x[0]
。
如果你看一下我刪除全局變量的簡化代碼,可能會更容易理解:
def foo():
x = [0]
def bar():
print x[0]
def change(z):
x[0] = z
change(1)
bar()
foo()
foo中的第一行創建一個包含一個元素的列表。 然后bar
被定義為在x
打印第一個元素的函數,函數change
修改列表的第一個元素。 當調用change(1)
,x的值變為[1]
。
這段代碼試圖解釋python何時創建一個新變量,以及python何時重用現有變量。 我稍微重寫了上面的代碼,以便更清楚地說明這一點。
y = "lion"
def foo():
x = ["tiger"]
w = "bear"
def bar():
print y, x[0], w
def change(z):
global y
x[0] = z
y = z
w = z
bar()
change("zap")
bar()
foo()
這將產生此輸出:
lion tiger bear
zap zap bear
關鍵是內部函數更改能夠影響變量y和數組x的元素,但它不會更改w (因為它獲得了自己的不共享的局部變量w )。
x = [0]創建一個值為0的新列表。 x [0]引用列表中的zero-eth元素,該元素也恰好為零。
該示例引用了代碼中的閉包或可通過的代碼塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.