元組(tuple)、數(shù)值型(number)、字符串(string)均為不可變對象,而字典型(dictionary)和列表型(list)的對象是可變對象。
員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),微信平臺小程序開發(fā),軟件按需網(wǎng)站建設(shè)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。1、在函數(shù)外部定義一個x=1,在函數(shù)內(nèi)部可以進(jìn)行引用打印出來
x=1
def test():
print(x)
test()
結(jié)果
2、在函數(shù)外部定義一個x=1,在函數(shù)內(nèi)部再定義一個x=2,這種情況等于定義了兩個內(nèi)存空間不同的x變量,所以的值也就不同。
x=1
def test():
x=2
print(x)
test()
print(x)
結(jié)果
3、如果在函數(shù)內(nèi)對函數(shù)外定義的不可變對象進(jìn)行修改的話,會有報(bào)錯
4、如果在函數(shù)內(nèi)對函數(shù)外定義的全局不可變對象進(jìn)行修改的話,同樣也會報(bào)錯
5、但是,如果在函數(shù)內(nèi)將函數(shù)外定義的不可變對象設(shè)為全局變量的話,可以修改函數(shù)外部變量,因?yàn)樵诤瘮?shù)內(nèi)將外部變量定義為全局的了。
x=1
def test():
global x
x=x+1
print(x)
test()
print(x)
結(jié)果
6、如果函數(shù)外部函數(shù)是一個可變對象的話,在函數(shù)內(nèi)部可以引用它的值,也可以對它進(jìn)行改變。
x=[]鄭州婦科醫(yī)院 http://www.ytsgfk120.com/
print(x)
def test():
x.append(1)
print(x)
test()
print(x)
結(jié)果:
7、今天發(fā)現(xiàn)之前用的一種錯誤的使用方法,就是我把函數(shù)的默認(rèn)參數(shù)設(shè)成了一個不可變對象,但是函數(shù)的默認(rèn)變量是在函數(shù)初始化時就綁定了了內(nèi)存地址的,對于不可變對象,改變的時候其實(shí)已經(jīng)改變了內(nèi)存地址,所以函數(shù)里的默認(rèn)值還是一開始定義的不可變對象的值。
token=1
def test(token=token):
print(token)
test()
token=token+1
test()
結(jié)果:
8、如果把函數(shù)的默認(rèn)參數(shù)設(shè)為一個可變對象的話,內(nèi)存地址是同一個,那么每次使用該默認(rèn)參數(shù)的時候,其實(shí)更改的是同一個變量,函數(shù)里的默認(rèn)值會發(fā)生改變。
token=[]
def test(token=token):
print(token)
test()
token=token.append(1)
test()
總結(jié):函數(shù)的默認(rèn)值最好是一個固定不會發(fā)生變化的值,如果在函數(shù)內(nèi)要改變外部定義的不可變對象的話,需要使用global將改對象定義為全局的。我自己都繞暈了,反正默認(rèn)值最好是不會變的就好了,會變的值就不要設(shè)為默認(rèn)值了,用全局變量吧。。這個問題我在用token的時候遇到了,我把token設(shè)為了函數(shù)的默認(rèn)值,但是token是字符串是不可變對象,所以即使全局的token值定時更新了,函數(shù)默認(rèn)值的那個token還是一開始那個,時間到就過期不能用了,我真是個憨批。。