Python中關(guān)鍵字nonlocal和global的聲明與解析
一、Python中g(shù)lobal與nonlocal 聲明
如下代碼
a = 10 def foo(): a = 100
執(zhí)行foo() 結(jié)果 a 還是10
函數(shù)中對(duì)變量的賦值,變量始終綁定到該函數(shù)的局部命名空間,使用global 語句可以改變這種行為。
>>> a 10 >>> def foo(): ... global a ... a = 100 ... >>> a 10 >>> foo() >>> a 100
解析名稱時(shí)首先檢查局部作用域,然后由內(nèi)而外一層層檢查外部嵌套函數(shù)定義的作用域,如找不到搜索全局命令空間和內(nèi)置命名空間。
盡管可以層層向外(上)查找變量,但是! ..python2 只支持最里層作用域(局部變量)和全局命令空間(gloabl),也就是說內(nèi)部函數(shù)不能給定義在外部函數(shù)中的局部變量重新賦值,比如下面代碼是不起作用的
def countdown(start): n = start def decrement(): n -= 1
python2 中,解決方法可以是是把修改值放到列表或字典中,python3 中,可以使用nonlocal 聲明完成修改
def countdown(start): n = start def decrement(): nonlocal n n -= 1
二、Python nonlocal 與 global 關(guān)鍵字解析
nonlocal
首先,要明確 nonlocal 關(guān)鍵字是定義在閉包里面的。請(qǐng)看以下代碼:
x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
結(jié)果
# inner: 2 # outer: 1 # global: 0
現(xiàn)在,在閉包里面加入nonlocal關(guān)鍵字進(jìn)行聲明:
x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
結(jié)果
# inner: 2 # outer: 2 # global: 0
看到區(qū)別了么?這是一個(gè)函數(shù)里面再嵌套了一個(gè)函數(shù)。當(dāng)使用 nonlocal 時(shí),就聲明了該變量不只在嵌套函數(shù)inner()里面
才有效, 而是在整個(gè)大函數(shù)里面都有效。
global
還是一樣,看一個(gè)例子:
x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
結(jié)果
# inner: 2 # outer: 1 # global: 2
global 是對(duì)整個(gè)環(huán)境下的變量起作用,而不是對(duì)函數(shù)類的變量起作用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python關(guān)鍵字and和or用法實(shí)例
這篇文章主要介紹了python關(guān)鍵字and和or用法實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05利用Python內(nèi)置庫實(shí)現(xiàn)創(chuàng)建命令行應(yīng)用程序
Python?有一個(gè)叫做argparse的內(nèi)置庫,可以用它來創(chuàng)建一個(gè)命令行界面。本文將詳解如何利用argparse實(shí)現(xiàn)創(chuàng)建一個(gè)命令行應(yīng)用程序,需要的可以參考一下2022-06-06Pycharm無法使用已經(jīng)安裝Selenium的解決方法
今天小編就為大家分享一篇Pycharm無法使用已經(jīng)安裝Selenium的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10python獲取當(dāng)前文件路徑以及父文件路徑的方法
今天小編就為大家分享一篇python獲取當(dāng)前文件路徑以及父文件路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python結(jié)合Sprak實(shí)現(xiàn)計(jì)算曲線與X軸上方的面積
這篇文章主要介紹了Python結(jié)合Sprak實(shí)現(xiàn)計(jì)算曲線與X軸上方的面積,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02Python接口測試數(shù)據(jù)庫封裝實(shí)現(xiàn)原理
這篇文章主要介紹了Python接口測試數(shù)據(jù)庫封裝實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05關(guān)于Python Socket編程的要點(diǎn)詳解
Socket是網(wǎng)絡(luò)編程的一個(gè)抽象概念,通常我們用一個(gè)Socket表示“打開了一個(gè)網(wǎng)絡(luò)鏈接”,而打開一個(gè)Socket需要知道目標(biāo)計(jì)算機(jī)的IP地址和端口號(hào),再指定協(xié)議類型即可,這篇文章主要給大家介紹了關(guān)于Python Socket編程的相關(guān)資料,需要的朋友可以參考下2021-08-08