nonlocal 和 global 也很容易混淆。簡單記錄下自己的理解。
解釋
global
總之一句話,作用域是全局的,就是會修改這個變量對應地址的值。
global 語句是一個聲明,它適用于整個當前代碼塊。 這意味著列出的標識符將被解釋為全局變量。 盡管自由變量可能指的是全局變量而不被聲明為全局變量。
global 語句中列出的名稱不得用于該全局語句之前的文本代碼塊中。
global 語句中列出的名稱不能定義為形式參數,也不能在 for 循環控制目標、 class 定義、函數定義、 import 語句或變量注釋中定義。
當前的實現并不強制執行這些限制,但是程序不應該濫用這種自由,因為未來的實現可能會強制執行這些限制,或者悄悄地改變程序的含義。
程序員注意: global 是指向解析器的指令。 它僅適用于與全局語句同時解析的代碼。 特別是,包含在提供給內置 exec() 函數的字符串或代碼對象中的全局語句不會影響包含函數調用的代碼塊,而且這種字符串中包含的代碼不會受包含函數調用的代碼中的全局語句的影響。 eval() 和 compile() 函數也是如此。
一、global
1、global關鍵字用來在函數或其他局部作用域中使用全局變量。但是如果不修改全局變量也可以不使用global關鍵字。
1
2
3
4
5
|
gcount = 0 def global_test(): gcount + = 1 print (gcount) global_test() |
以上代碼會報錯:第一行定義了全局變量,在內部函數中又對外部函數進行了引用并修改,那么python會認為它是一個局部變量,有因為內部函數沒有對其gcount進行定義和賦值,所以報錯。
2、如果局部要對全局變量修改,則在局部聲明該全局變量
1
2
3
4
5
6
|
gcount = 0 def global_test(): global gcount gcount + = 1 print (gcount) global_test() |
以上輸出為:1
3、如果局部不聲明全局變量,并且不修改全局變量,則可以正常使用
1
2
3
4
|
gcount = 0 def global_test(): print (gcount) global_test() |
以上輸出為:0
二、nonlocal
nonlocal
只在閉包里面生效,作用域就是閉包里面的,外函數和內函數都影響,但是閉包外面不影響。
nonlocal 語句使列出的標識符引用除 global 變量外最近的封閉范圍中的以前綁定的變量。 這很重要,因為綁定的默認行為是首先搜索本地名稱空間。 該語句允許封裝的代碼將變量重新綁定到除全局(模塊)作用域之外的本地作用域之外。
nonlocal 語句中列出的名稱與 global 語句中列出的名稱不同,它們必須引用封閉范圍中已經存在的綁定(無法明確確定應在其中創建新綁定的范圍)。
1、 nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def make_counter(): count = 0 def counter(): nonlocal count count + = 1 return count return counter def make_counter_test(): mc = make_counter() print (mc()) print (mc()) print (mc()) make_counter_test() |
以上輸出為:
1
2
3
三、混合使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def scope_test(): def do_local(): spam = "local spam" #此函數定義了另外的一個spam字符串變量,并且生命周期只在此函數內。此處的spam和外層的spam是兩個變量,如果寫出spam = spam + “local spam” 會報錯 def do_nonlocal(): nonlocal spam #使用外層的spam變量 spam = "nonlocal spam" def do_global(): global spam spam = "global spam" spam = "test spam" do_local() print ( "After local assignmane:" , spam) do_nonlocal() print ( "After nonlocal assignment:" ,spam) do_global() print ( "After global assignment:" ,spam) scope_test() print ( "In global scope:" ,spam) |
以上輸出為:
After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
總結
以上所述是小編給大家介紹的Python中 Global和Nonlocal的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
原文鏈接:https://segmentfault.com/a/1190000021625267