nonlocal
和global
也很容易混淆。簡單記錄下自己的理解。
總之一句話,作用域是全域性的,就是會修改這個變數對應位址的值。
global
語句是乙個宣告,它適用於整個當前**塊。 這意味著列出的識別符號將被解釋為全域性變數。 儘管自由變數可能指的是全域性變數而不被宣告為全域性變數。
global
語句中列出的名稱不得用於該全域性語句之前的文字**塊中。
global
語句中列出的名稱不能定義為形式引數,也不能在for
迴圈控制目標、class
定義、函式定義、import
語句或變數注釋中定義。
當前的實現並不強制執行這些限制,但是程式不應該濫用這種自由,因為未來的實現可能會強制執行這些限制,或者悄悄地改變程式的含義。
程式設計師注意:global
是指向解析器的指令。 它僅適用於與全域性語句同時解析的**。 特別是,包含在提供給內建exec()
函式的字串或**物件中的全域性語句不會影響包含函式呼叫的**塊,而且這種字串中包含的**不會受包含函式呼叫的**中的全域性語句的影響。eval()
和compile()
函式也是如此。只在閉包裡面生效,作用域就是閉包裡面的,外函式和內函式都影響,但是閉包外面不影響。
nonlocal
語句使列出的識別符號引用除global
變數外最近的封閉範圍中的以前繫結的變數。 這很重要,因為繫結的預設行為是首先搜尋本地命名空間。 該語句允許封裝的**將變數重新繫結到除全域性(模組)作用域之外的本地作用域之外。
nonlocal
語句中列出的名稱與global
語句中列出的名稱不同,它們必須引用封閉範圍中已經存在的繫結(無法明確確定應在其中建立新繫結的範圍)。沒有用
nonlocal
和global
x =
0def
outer()
: x =
1def
inner()
: x =
2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("global:"
, x)
# inner: 2
# outer: 1
# global: 0
nonlocal
的作用範圍x =
0def
outer()
: x =
1def
inner()
:nonlocal x
x =2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("global:"
, x)
# inner: 2
# outer: 2
# global: 0
global
的作用範圍x =
0def
outer()
: x =
1def
inner()
:global x
x =2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("global:"
, x)
# inner: 2
# outer: 1
# global: 2
x =
0def
outer()
:global x
x =1def
inner()
:nonlocal x
x =2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("global:"
, x)
# syntaxerror: no binding for nonlocal 'x' found
x =
0def
outer()
:def
inner()
:nonlocal x
x =2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("global:"
, x)
# syntaxerror: no binding for nonlocal 'x' found
x =
0def
outer()
: x =
1nonlocal x
definner()
: x =
2print
("inner:"
, x)
inner(
("outer:"
, x)
outer(
("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...