Python Global和Nonlocal的用法

2021-10-02 05:42:41 字數 3232 閱讀 5562

nonlocalglobal也很容易混淆。簡單記錄下自己的理解。

總之一句話,作用域是全域性的,就是會修改這個變數對應位址的值。

global語句是乙個宣告,它適用於整個當前**塊。 這意味著列出的識別符號將被解釋為全域性變數。 儘管自由變數可能指的是全域性變數而不被宣告為全域性變數。

global語句中列出的名稱不得用於該全域性語句之前的文字**塊中。

global語句中列出的名稱不能定義為形式引數,也不能在for迴圈控制目標、class定義、函式定義、import語句或變數注釋中定義。

當前的實現並不強制執行這些限制,但是程式不應該濫用這種自由,因為未來的實現可能會強制執行這些限制,或者悄悄地改變程式的含義。

程式設計師注意:global是指向解析器的指令。 它僅適用於與全域性語句同時解析的**。 特別是,包含在提供給內建exec()函式的字串或**物件中的全域性語句不會影響包含函式呼叫的**塊,而且這種字串中包含的**不會受包含函式呼叫的**中的全域性語句的影響。eval()compile()函式也是如此。

只在閉包裡面生效,作用域就是閉包裡面的,外函式和內函式都影響,但是閉包外面不影響。

nonlocal語句使列出的識別符號引用除global變數外最近的封閉範圍中的以前繫結的變數。 這很重要,因為繫結的預設行為是首先搜尋本地命名空間。 該語句允許封裝的**將變數重新繫結到除全域性(模組)作用域之外的本地作用域之外。

nonlocal語句中列出的名稱與global語句中列出的名稱不同,它們必須引用封閉範圍中已經存在的繫結(無法明確確定應在其中建立新繫結的範圍)。

沒有用nonlocalglobal

x =

0def

outer()

: x =

1def

inner()

: x =

2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# inner: 2

# outer: 1

# global: 0

nonlocal的作用範圍

x =

0def

outer()

: x =

1def

inner()

:nonlocal x

x =2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# inner: 2

# outer: 2

# global: 0

global的作用範圍

x =

0def

outer()

: x =

1def

inner()

:global x

x =2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# inner: 2

# outer: 1

# global: 2

x =

0def

outer()

:global x

x =1def

inner()

:nonlocal x

x =2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# syntaxerror: no binding for nonlocal 'x' found

x =

0def

outer()

:def

inner()

:nonlocal x

x =2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# syntaxerror: no binding for nonlocal 'x' found

x =

0def

outer()

: x =

1nonlocal x

definner()

: x =

2print

("inner:"

, x)

inner(

)print

("outer:"

, x)

outer(

)print

("global:"

, x)

# syntaxerror: name 'x' is assigned to before nonlocal declaration

python global和nonlocal的使用

變數定義在函式外部的時候,如果函式裡面想改變這個全域性變數的值,需要在當前的引用函式裡面重新定義乙個變數 並用關鍵字global修飾。例如 a 1 def b a 1 print a b 用ide寫完這段 的時候,還沒執行就會報紅線提示錯誤,執行之後產生錯誤,錯誤內容為 unboundlocaler...

python global全域性變數

在函式的內部如果想使用函式外的變數,並且希望改變該變數的值,可以考慮使用global關鍵字,從而告訴直譯器該變數在函式體外部定義,當前函式可以對其進行改變。下面請看加global語句和不加global語句使用變數的差別。usr bin python deffunc x print x is x x ...

python global的詳細使用

有一點基礎的應該都知道,這個global關鍵字,用於宣告後面的變數是全域性變數。下面分幾種情況進行說明 a 1defhi print f a hi a 1 a 1defhi print a a 2print f 函式內部的a hi print f 函式外部的a out 報錯 unboundlocal...