函數(shù)--變量作用域

函數(shù)是代碼重用最基本的部件
定義函數(shù):Python使用def關(guān)鍵字定義函數(shù)
def 函數(shù)名(參數(shù)1,參數(shù)2):
  xxx

變量作用域

Python變量作用域一共有4種

L (Local) 局部作用域
E (Enclosing) 閉包函數(shù)外的函數(shù)中
G (Global) 全局作用域
B (Built-in) 內(nèi)建作用域

以 L –> E –> G –>B 的規(guī)則查找哑芹,即:在局部找不到沧烈,便會(huì)去局部外的局部找(例如閉包)鞭衩,再找不到就會(huì)去全局找,再者去內(nèi)建中找
Python中,def/class/lambda中賦值的變量,其作用域?yàn)?strong>局部作用域,且三者的身份相同,故犬性,類中函數(shù)要調(diào)用類中賦值變量,需增加self前綴
要點(diǎn):
1.函數(shù)可直接調(diào)用全局變量

name = 1
def fun():
    print(name)
if __name__ == "__main__":
    fun()
>>>1

2.函數(shù)中賦值和全局變量同名的變量腾仅,此時(shí)函數(shù)內(nèi)變量為新局部變量乒裆,故使用前需先賦值;在函數(shù)作用域中推励,局部變量覆蓋同名全局作變量鹤耍,但不會(huì)影響全局變量

name = 1
def fun():
    print(name)
    name = 0
if __name__ == "__main__":
    fun()
>>>Traceback (most recent call last):
  File "test.py", line 7, in <module>
    fun()
  File "test.py", line 3, in fun
    print(name)
UnboundLocalError: local variable 'name' referenced before assignment
# name此時(shí)為局部變量
name = 1
def fun():
    name = 0
    print(name)
if __name__ == "__main__":
    fun()
>>>0

3.局部作用域中想對(duì)全局變量賦值,或者想在局部作用域中生成全局變量验辞,使用global關(guān)鍵字

# Python執(zhí)行時(shí)稿黄,即使調(diào)用的函數(shù),也會(huì)先執(zhí)行函數(shù)外部的其他語句跌造,再執(zhí)行函數(shù)
# 故fun()執(zhí)行前杆怕,會(huì)先打印1,然后執(zhí)行了fun壳贪,在執(zhí)行print打印name
name = 1
def fun():
    global name 
    name = 0
print(name)
if __name__ == "__main__":
    fun()
    print(name)
>>>1
>>>0

4.函數(shù)中可以嵌套函數(shù)陵珍,特殊場(chǎng)景為閉包
閉包:引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在违施,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外互纯,如下

def A():
    param=1
    def B():
        param1=param
        print(param1)
    return B
if __name__ == '__main__':
    A()()
>>>1

B為A嵌套函數(shù),B中引用外部函數(shù)變量(即上文中自由變量)磕蒲;
調(diào)用函數(shù)A留潦,返回函數(shù)B實(shí)例(返回函數(shù)B即稱閉包),此時(shí)變量param被記住辣往。即A函數(shù)調(diào)用結(jié)束(局部變量函數(shù)調(diào)用后即時(shí)失效)愤兵,param變量依然存在

global和nonlocal

global:函數(shù)中若想修改全局變量,需使用該關(guān)鍵字聲明
nonlocal:允許嵌套def對(duì)其外部函數(shù)中變量賦值(一般只引用)且這個(gè)變量需已在外層被賦值過排吴,而非在嵌套def中初始賦值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市懦鼠,隨后出現(xiàn)的幾起案子钻哩,更是在濱河造成了極大的恐慌屹堰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街氢,死亡現(xiàn)場(chǎng)離奇詭異扯键,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)珊肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門荣刑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伦乔,你說我怎么就攤上這事厉亏。” “怎么了烈和?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵爱只,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我招刹,道長(zhǎng)恬试,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任疯暑,我火速辦了婚禮训柴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妇拯。我一直安慰自己幻馁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布乖阵。 她就那樣靜靜地躺著宣赔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞪浸。 梳的紋絲不亂的頭發(fā)上儒将,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音对蒲,去河邊找鬼钩蚊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹈矮,可吹牛的內(nèi)容都是我干的砰逻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泛鸟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蝠咆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤刚操,失蹤者是張志新(化名)和其女友劉穎闸翅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菊霜,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坚冀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴逞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片记某。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖构捡,靈堂內(nèi)的尸體忽然破棺而出液南,到底是詐尸還是另有隱情,我是刑警寧澤叭喜,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布贺拣,位于F島的核電站,受9級(jí)特大地震影響捂蕴,放射性物質(zhì)發(fā)生泄漏譬涡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一啥辨、第九天 我趴在偏房一處隱蔽的房頂上張望涡匀。 院中可真熱鬧,春花似錦溉知、人聲如沸陨瘩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌劳。三九已至,卻和暖如春玫荣,著一層夾襖步出監(jiān)牢的瞬間甚淡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工捅厂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯卦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓焙贷,卻偏偏與公主長(zhǎng)得像撵割,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辙芍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354