Python Global和Nonlocal的用法

nonlocalglobal 也很容易混淆。簡單記錄下本身的理解。python

解釋

global

總之一句話,做用域是全局的,就是會修改這個變量對應地址的值。程序員

global 語句是一個聲明,它適用於整個當前代碼塊。 這意味着列出的標識符將被解釋爲全局變量。 儘管自由變量可能指的是全局變量而不被聲明爲全局變量。segmentfault

global語句中列出的名稱不得用於該全局語句以前的文本代碼塊中。閉包

global語句中列出的名稱不能定義爲形式參數,也不能在 for 循環控制目標、class定義、函數定義、import語句或變量註釋中定義。函數

當前的實現並不強制執行這些限制,可是程序不該該濫用這種自由,由於將來的實現可能會強制執行這些限制,或者悄悄地改變程序的含義。spa

程序員注意: global是指向解析器的指令。 它僅適用於與全局語句同時解析的代碼。 特別是,包含在提供給內置 exec()函數的字符串或代碼對象中的全局語句不會影響包含函數調用的代碼塊,並且這種字符串中包含的代碼不會受包含函數調用的代碼中的全局語句的影響。 eval()compile()函數也是如此。

在這裏插入圖片描述

nonlocal

只在閉包裏面生效,做用域就是閉包裏面的,外函數和內函數都影響,可是閉包外面不影響。code

nonlocal 語句使列出的標識符引用除global變量外最近的封閉範圍中的之前綁定的變量。 這很重要,由於綁定的默認行爲是首先搜索本地名稱空間。 該語句容許封裝的代碼將變量從新綁定到除全局(模塊)做用域以外的本地做用域以外。對象

nonlocal語句中列出的名稱與global語句中列出的名稱不一樣,它們必須引用封閉範圍中已經存在的綁定(沒法明確肯定應在其中建立新綁定的範圍)。blog

舉例

沒有用 nonlocalglobal圖片

x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 1
# global: 0

nonlocal 的做用範圍

x = 0
def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 2
# global: 0

global 的做用範圍

x = 0
def outer():
    x = 1
    def inner():
        global x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)

outer()
print("global:", x)

# inner: 2
# outer: 1
# global: 2

注意

  • 本地的變量聲明爲global,就不能在再聲明爲nonlocal
x = 0
def outer():
    global x
    x = 1
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)
    inner()
    print("outer:", x)
outer()
print("global:", x)

# SyntaxError: no binding for nonlocal 'x' found

  • 使用nonlocal以前須要初始化變量
x = 0
def outer():
    def inner():
        nonlocal x
        x = 2
        print("inner:", x)
    inner()
    print("outer:", x)
outer()
print("global:", x)
# SyntaxError: no binding for nonlocal 'x' found

  • 不能在函數的外部函數裏面聲明nonlocal
x = 0
def outer():
    x = 1
    nonlocal x
    def inner():
        x = 2
        print("inner:", x)
    inner()
    print("outer:", x)
outer()
print("global:", x)
# SyntaxError: name 'x' is assigned to before nonlocal declaration
若是你感興趣能夠關注公衆號「chasays」- 程序員匯聚地
在這裏插入圖片描述
相關文章
相關標籤/搜索