簡體   English   中英

為什么非本地關鍵字被全局關鍵字“中斷”?

[英]Why is nonlocal keyword being 'interrupted' by a global keyword?

我是一個初學程序員,正在嘗試學習python,我遇到了范圍主題。 在執行最底層的代碼時,我遇到了錯誤'找不到非本地var_name的綁定'。 有人可以解釋為什么nonlocal關鍵字無法“超越”中間函數並進入外部函數?


#this works
globe = 5


def outer():
    globe = 10
    def intermediate():

        def inner():
            nonlocal globe
            globe = 20
            print(globe)
        inner()
        print(globe)
    intermediate()
    print(globe)


outer()

globe = 5


def outer():
    globe = 10
    def intermediate():
        global globe #but not when I do this
        globe = 15
        def inner():
            nonlocal globe #I want this globe to reference 10, the value in outer()
            globe = 20
            print(globe)
        inner()
        print(globe)
    intermediate()
    print(globe)


outer()

涉及nonlocal關鍵字的表達式將導致Python嘗試在封閉的本地范圍中查找變量,直到它首次遇到第一個指定的變量

nonlocal globe表達式將查看intermediate函數中是否存在名為globe的變量。 然而,它會在global范圍內遇到它,因此它會假定它已經達到模塊范圍並且在沒有找到非nonclocal范圍的情況下完成搜索它,因此是例外。

通過在intermediate函數中聲明global globe ,您幾乎關閉了在前一個作用域中使用相同名稱訪問任何nonlocal變量的路徑。 您可以在這里查看討論為什么“決定”在Python中以這種方式實現。

如果要確保變量globe是否在某個函數的局部范圍內,可以使用dir()函數,因為來自Python文檔

如果沒有參數,則返回當前本地范圍中的名稱列表。 使用參數,嘗試返回該對象的有效屬性列表。

暫無
暫無

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

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