Enclosing->Global->Built-in順序:a=1deffunc1():...print(a)...a=111...print(a)...func1()Traceback(mostrecentcalllast):File"",line1,inFile"",line2,infunc1UnboundLocalError:localvariable'a'referencedbeforeass" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python 函數(shù) 變量和閉包

系統(tǒng) 1720 0

首先我們認(rèn)定,python中定義域查找遵循local->Enclosing->Global->Built-in順序:

a=1
def func1():
... print(a)
... a=111
... print(a)
...
func1()
Traceback (most recent call last):
File " ", line 1, in
File " ", line 2, in func1
UnboundLocalError: local variable 'a' referenced before assignment

而:

a=1
def fun():
... print(a)
... b=111
... print(b)
...
fun()
1
111
print(b)
Traceback (most recent call last):
File " ", line 1, in
NameError: name 'b' is not defined

我們可以得出結(jié)論(打臉):內(nèi)置函數(shù)先在內(nèi)置函數(shù)定義域內(nèi)(前后)尋找變量;找不到之后再?gòu)娜肿兞恐幸M(jìn),且局部變量無(wú)法全局。
如果global:

a=1
def func1():
... global a
... print(a)
... a=111
... print(a)
...
func1()
1
111
a
111

但是不多久后我發(fā)現(xiàn)一個(gè)問(wèn)題,代碼如下:

a=10
def test():
... a = a + 1
... print(a)
...
test()
Traceback (most recent call last):
File " ", line 1, in
File " ", line 2, in test
UnboundLocalError: local variable 'a' referenced before assignment
test(a)
Traceback (most recent call last):
File " ", line 1, in
TypeError: test() takes 0 positional arguments but 1 was given
所以這個(gè)問(wèn)題其實(shí)可以被拆分為兩個(gè)問(wèn)題,一個(gè)是arguments的問(wèn)題,還有一個(gè)是variable的問(wèn)題。
當(dāng)定義了一個(gè)argument的時(shí)候只要在括號(hào)里把global中的variable代入就是可以運(yùn)行的,前提就是可一定要定義啊!!!

a=1
def func1(a):
... print(a)
... a=111
... print(a)
...
func1(a)
1
111

也就是說(shuō)問(wèn)題根本不在global,而是我有沒(méi)有把a(bǔ)帶進(jìn)去...(哭泣)
結(jié)論就是一切都是我自作多情想多了,自己的bug

a=10
def test(a):
... print(a)
... a=a+1
... print(a)
...
test(a)
10
11

所以回到第一個(gè)例子,所謂的“l(fā)ocal variable referred before assignment”只是因?yàn)槲覜](méi)有把變量在定義的時(shí)候放進(jìn)去。

這是第一件事

第二件:只有模塊,類(lèi)以及函數(shù)才會(huì)引入新的定義域,其他代碼塊如(if/else,while)是不會(huì)的:

a=0
while a < 4:
... print(a)
... a += 1
...
0
1
2
3
a
4

三: 嵌套和閉包

def out():
... a=7
... def inner():
... nonlocal a
... print(a)
... a=9
... print(a)
... inner()
... print(a)
...
out()
7
9
9

嵌套和nonlocal都超好理解
讓我斯巴達(dá)的是如下:

def fun2(a):
... print(a)
... def fun3(b):
... print(a,b)
... return fun3 #返回fun3函數(shù)結(jié)果
...
fun2(1)
1
.fun3 at 0x000001E2857C24C8>
f=fun2(1)
1
f
.fun3 at 0x000001E2857A4828>
f(4)
1 4

嗯這就是傳說(shuō)中的閉包,閉包使得函數(shù)內(nèi)部的變量可以一直被保存并且被外部使用(像個(gè)自由的包裹一直裹著里面的變量)
為了更直觀一點(diǎn):

def out():
... def inner():
... a=5
... return a
... inner()
... return inner
...
f=out()
f
.inner at 0x000001E2857A4678>
f()
5

可見(jiàn)調(diào)用的這個(gè)定義函數(shù),返回的仍舊是一個(gè)函數(shù),而不是一個(gè)值。out()不是一個(gè)函數(shù)運(yùn)行結(jié)果而是一個(gè)由返回的inner函數(shù)和變量a構(gòu)成的函數(shù)(因?yàn)殚]包的本質(zhì)就是一種函數(shù),由局部變量和內(nèi)部函數(shù)構(gòu)成)。
具體一點(diǎn)說(shuō)來(lái),在第一個(gè)例子中,運(yùn)行fun2(1)將同時(shí)得到print出來(lái)的一個(gè)a,和一個(gè)以fun3為函數(shù),被保留的a和未被賦值的b為變量的函數(shù)。【當(dāng)定義符合閉包條件時(shí),自由變量(此處的f)變成一個(gè)閉包類(lèi),有函數(shù)的效果】。
至于為什么它的地址在變化,我覺(jué)得是因?yàn)樗看握{(diào)用都返回了一個(gè)新函數(shù)(分開(kāi)儲(chǔ)存)。

233333我又看到了一個(gè)神奇東西

def count():
... fs=[]
... for i in range(1,4):
... def f():
... return i*i
... fs.append(f)
... return fs
...
f1,f2,f3=count()
f1
.f at 0x000001E2857A4438>
f1()
9
f2()
9
f3()
9

此處函數(shù)為閉包的原因在于append的那個(gè)f,如果我做一個(gè)改動(dòng)

def count():
... fs=[]
... for i in range(1,4):
... def f():
... return i*i
... fs.append(f())
... return fs
...
count()
[1, 4, 9]

它就不是閉包了,count可以正常輸出結(jié)果。
而在這里,返回的函數(shù)是i*i,但是由于返回時(shí)i=3,f1,f2,f3都變成了9。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲综合久久久久久中文字幕 | 岛国在线123456 | 亚洲国产中文字幕 | 蜜臀AV性色A片在线观看 | av一区二区三区 | 114美女做爰视频在线 | 一区二区三区国产免费 | 波多野结衣在线看片 | 成人练习生演员 | 五月天中文在线 | 成人综合久久精品色婷婷 | 亚洲成人精品在线观看 | 久久91| 男女免费视频网站 | 久热精品视频 | 色婷婷久久久久swag精品 | 国内自拍一二三四2021 | 久久夜夜| 亚洲综合久久1区2区3区 | 久久久久国产一区二区三区四区 | 色播在线播放 | 欧美色伊人 | 色人阁在线| 免费av大全 | 久草电影天堂 | 免费观看黄色a一级视频播放 | dy天堂 | av免费在线免费观看 | 色综合天天综合中文网 | 亚洲美女亚洲精品久久久久 | 国内精品一区二区 | 国产亚洲欧美一区 | 这里只有精品在线视频观看 | jizz18免费视频| 中文字幕一区二区精品区 | 日韩高清中文字幕 | 日本在线观看视频网站 | 国产三级网站在线观看 | 亚洲视频 中文字幕 | 欧洲另类在线1 | 中文字幕精品一区二区三区精品 |