摘要:聲明這篇文章很大程度上借鑒了。作用域僅限于函數(shù)中,從函數(shù)外是訪問(wèn)不到的。變量在源文件中非函數(shù)或類聲明的變量默認(rèn)是變量。正確的做法應(yīng)該是變量是引入的,只能用于嵌套函數(shù)中。在嵌套函數(shù)中使用聲明變量,可以修改外層函數(shù)中的變量。
聲明: 這篇文章很大程度上借鑒了Global, Local and nonlocal Variables。local變量
與其它的編程語(yǔ)言相同,在函數(shù)中聲明的變量都是local變量。作用域僅限于函數(shù)中,從函數(shù)外是訪問(wèn)不到的。
In [1]: def f(): s = "local val" print("read s from interval:", s) In [2]: print(s) NameError: name "s" is not defined In [3]: f() read s from interval: local valglobal變量
在源文件中(非函數(shù)或類)聲明的變量默認(rèn)是global變量。
在函數(shù)中可以隨意讀取global變量,這一點(diǎn)不多說(shuō),不管是函數(shù)聲明在前,還是global變量聲明在前
涉及到修改global變量的時(shí)候,要特別注意了: 如果在函數(shù)體中未使用global聲明這個(gè)變量,那么函數(shù)體中修改的是local變量的值,global變量并未更新。
In [4]: s = "global val" In [6]: def f(): ...: s = "change global val" ...: print("change global val", s) ...: In [7]: f() change global val change global val In [8]: s Out[8]: "global val"
正確的做法應(yīng)該是:
In [4]: s = "global val" In [6]: def f(): ...: global s ...: s = "change global val" ...: print("change global val", s) ...: In [7]: f() change global val change global val In [8]: s Out[8]: "change global val change global val"nonlocal變量
nonlocal是python3引入的,只能用于嵌套函數(shù)中。在嵌套函數(shù)中使用nonlocal聲明變量,可以修改外層函數(shù)中的變量。
In [11]: def outer(): ...: s = "outer val" ...: def inner(): ...: nonlocal s ...: s = "inner val" ...: print("change outer s",s) ...: print("before inner(), s=", s) ...: inner() ...: print("after inner(), s=", s) ...: In [12]: outer() before inner(), s= outer val change outer s inner val after inner(), s= inner val
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44097.html
摘要:關(guān)鍵字在中,閉包只能讀外部函數(shù)的變量,而不能改寫(xiě)它。注意關(guān)鍵字是中出現(xiàn)的所以在中無(wú)法直接使用關(guān)鍵字里只有種作用域全局作用域和局部作用域。兩者使用的范圍不同。 關(guān)鍵字nonlocal 在Python 2.x中,閉包只能讀外部函數(shù)的變量,而不能改寫(xiě)它。為了解決這個(gè)問(wèn)題,Python 3.x引入了nonlocal關(guān)鍵字,在閉包內(nèi)用nonlocal聲明變量,就可以讓解釋器在外層函數(shù)中查找變量名...
摘要:正如我們前面舉的張三的例子那樣,不同命名空間中的名稱之間沒(méi)有任何關(guān)系。作用域作用域,是一個(gè)命名空間可直接發(fā)放完的代碼的文本區(qū)域。刪除也是如此,語(yǔ)句會(huì)從局部命名空間的引用中移除對(duì)的綁定。 命名空間和作用域的概念我們之前也提到過(guò),比如內(nèi)置函數(shù)globals(),函數(shù)中變量的作用域,模塊使用的import等等。這些可能讓我們對(duì)這兩個(gè)概念有了大致的理解。本節(jié)再詳細(xì)探討一下。 showImg(h...
摘要:真正管理這些名子的事物就是本文的主角命名空間。閉包命名空間閉包函數(shù)的名稱空間引入。函數(shù)調(diào)用時(shí)產(chǎn)生新的局部命名空間函數(shù)返回結(jié)果拋出異常時(shí)釋放命名空間,每一次遞歸都生成一個(gè)命名空間。標(biāo)識(shí)符產(chǎn)生地點(diǎn)決定標(biāo)識(shí)符所處的命名空間。 懶得掃全文的童鞋,可以直接跳到最后看總結(jié)。我們先從一個(gè)簡(jiǎn)單的栗子說(shuō)起: 栗子 a 文件中有變量 va 以及類 A,b 文件導(dǎo)入 a 中class A ,并打印出 A: ...
摘要:項(xiàng)目地址閉包在計(jì)算機(jī)科學(xué)中,閉包英語(yǔ),又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。 項(xiàng)目地址:https://git.io/pytips 閉包(Closure) 在計(jì)算機(jī)科學(xué)中,閉包(英語(yǔ):Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是...
摘要:第一種情況打印結(jié)果為第二種打印結(jié)果為因?yàn)槿绻J(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。 名稱空間與作用域 1.變量?jī)?chǔ)存在一個(gè)內(nèi)存空間中 2.當(dāng)程序運(yùn)行的時(shí)候代碼從上到下依次執(zhí)行,它會(huì)將變量與值的關(guān)系存儲(chǔ)在一個(gè)空間中,這個(gè)空間叫名稱空間,命名空間,全局名稱空間 3.當(dāng)程序遇到函數(shù)時(shí),它會(huì)將函數(shù)名存在內(nèi)存中,函數(shù)體漠不關(guān)心 4.當(dāng)程序執(zhí)行的時(shí)候,內(nèi)存會(huì)臨時(shí)開(kāi)辟一個(gè)空間,...
閱讀 3946·2023-04-25 16:32
閱讀 2255·2021-09-28 09:36
閱讀 2076·2021-09-06 15:02
閱讀 715·2021-09-02 15:21
閱讀 951·2019-08-30 15:56
閱讀 3554·2019-08-30 15:45
閱讀 1750·2019-08-30 13:09
閱讀 410·2019-08-29 16:05