這篇文章Python中關鍵字nonlocal和global的聲明與解析介紹的相關資料,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
一、Python中global與nonlocal 宣告
#如下程式碼
a = 10 def foo(): a = 100
執行foo() 結果a 還是10
#函數
變數的賦值,變數總是綁定到函數的局部命名空間,使用global 語句可以改變這個行為。
>>> a 10 >>> def foo(): ... global a ... a = 100 ... >>> a 10 >>> foo() >>> a 100解析名稱時先檢查局部作用域,然後由內而外一層層檢查外部巢狀函數定義的作用域,如找不到搜尋全域指令空間和內建命名空間。
儘管可以層層向外(上)查找變量,但是! ..python2 只支援最裡層作用域(局部變量)和全域命令空間(gloabl),也就是說內部函數不能給定義在外部函數中的局部變數重新賦值,例如下面程式碼是不起作用的
#
def countdown(start): n = start def decrement(): n -= 1python2 中,解決方法可以是把修改值放到列表或字典中,python3 中,可以使用nonlocal 宣告完成修改
def countdown(start): n = start def decrement(): nonlocal n n -= 1
nonlocal
首先,要先明確nonlocal 關鍵字是定義在閉包裡面的。請看以下程式碼:
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###看到差異了麼?這是一個函數裡面再巢狀了一個函數。當使用 nonlocal 時,就宣告了該變數不只在巢狀函數inner()裡面###才有效, 而是在整個大函數裡面都有效。 ############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 是對整個環境下的變數起作用,而不是對函數類別的變數起作用。 ###
以上是Python中關鍵字nonlocal和global的宣告與解析介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!