Python中 Global和Nonlocal的用法詳解
nonlocal 和 global 也很容易混淆。簡單記錄下自己的理解。
解釋
global
總之一句話,作用域是全局的,就是會修改這個變量對應(yīng)地址的值。
global 語句是一個聲明,它適用于整個當(dāng)前代碼塊。 這意味著列出的標(biāo)識符將被解釋為全局變量。 盡管自由變量可能指的是全局變量而不被聲明為全局變量。
global 語句中列出的名稱不得用于該全局語句之前的文本代碼塊中。
global 語句中列出的名稱不能定義為形式參數(shù),也不能在 for 循環(huán)控制目標(biāo)、 class 定義、函數(shù)定義、 import 語句或變量注釋中定義。
當(dāng)前的實現(xiàn)并不強(qiáng)制執(zhí)行這些限制,但是程序不應(yīng)該濫用這種自由,因為未來的實現(xiàn)可能會強(qiáng)制執(zhí)行這些限制,或者悄悄地改變程序的含義。
程序員注意: global 是指向解析器的指令。 它僅適用于與全局語句同時解析的代碼。 特別是,包含在提供給內(nèi)置 exec() 函數(shù)的字符串或代碼對象中的全局語句不會影響包含函數(shù)調(diào)用的代碼塊,而且這種字符串中包含的代碼不會受包含函數(shù)調(diào)用的代碼中的全局語句的影響。 eval() 和 compile() 函數(shù)也是如此。

一、global
1、global關(guān)鍵字用來在函數(shù)或其他局部作用域中使用全局變量。但是如果不修改全局變量也可以不使用global關(guān)鍵字。
gcount = 0 def global_test(): gcount+=1 print (gcount) global_test()
以上代碼會報錯:第一行定義了全局變量,在內(nèi)部函數(shù)中又對外部函數(shù)進(jìn)行了引用并修改,那么python會認(rèn)為它是一個局部變量,有因為內(nèi)部函數(shù)沒有對其gcount進(jìn)行定義和賦值,所以報錯。
2、如果局部要對全局變量修改,則在局部聲明該全局變量
gcount = 0 def global_test(): global gcount gcount+=1 print (gcount) global_test()
以上輸出為:1
3、如果局部不聲明全局變量,并且不修改全局變量,則可以正常使用
gcount = 0 def global_test(): print (gcount) global_test()
以上輸出為:0
二、nonlocal
nonlocal
只在閉包里面生效,作用域就是閉包里面的,外函數(shù)和內(nèi)函數(shù)都影響,但是閉包外面不影響。
nonlocal 語句使列出的標(biāo)識符引用除 global 變量外最近的封閉范圍中的以前綁定的變量。 這很重要,因為綁定的默認(rèn)行為是首先搜索本地名稱空間。 該語句允許封裝的代碼將變量重新綁定到除全局(模塊)作用域之外的本地作用域之外。
nonlocal 語句中列出的名稱與 global 語句中列出的名稱不同,它們必須引用封閉范圍中已經(jīng)存在的綁定(無法明確確定應(yīng)在其中創(chuàng)建新綁定的范圍)。
1、 nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數(shù)內(nèi)的變量
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
三、混合使用
def scope_test():
def do_local():
spam = "local spam" #此函數(shù)定義了另外的一個spam字符串變量,并且生命周期只在此函數(shù)內(nèi)。此處的spam和外層的spam是兩個變量,如果寫出spam = spam + “l(fā)ocal 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
總結(jié)
以上所述是小編給大家介紹的Python中 Global和Nonlocal的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python3爬蟲里關(guān)于識別微博宮格驗證碼的知識點詳解
在本篇文章里小編給大家分享了關(guān)于Python3爬蟲里關(guān)于識別微博宮格驗證碼的知識點,有興趣的朋友們可以參考下。2020-07-07
python中復(fù)數(shù)的共軛復(fù)數(shù)知識點總結(jié)
在本篇內(nèi)容里小編給大家整理的是關(guān)于python中復(fù)數(shù)的共軛復(fù)數(shù)知識點總結(jié),有需要的朋友們可以學(xué)習(xí)下。2020-12-12
Python使用tkinter模塊實現(xiàn)推箱子游戲
這篇文章主要介紹了Python使用tkinter模塊實現(xiàn)推箱子游戲,主要分享兩點,第一就是這個程序的實現(xiàn)過程,第二點就是我在編寫過程中的一些思考。本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參看下吧2019-10-10
淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點
這篇文章主要介紹了淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Python中不同數(shù)據(jù)對象的空值校驗的方法小結(jié)
Python中有多種數(shù)據(jù)對象,每種都有其特定的空值表示方法和校驗方式,本文將深入探討這些空值校驗的方法,有需要的小伙伴可以參考一下2024-04-04

