簡體   English   中英

有人可以解釋一下這段Python代碼嗎?

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

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