=+’與‘+=’亦有不同
’=+‘就是a=a+1這類的操作
’+=‘就是a+=1這類的操作
是不是看起來一樣?其實有點區(qū)別
先看一個例子:
a = [20, 50] print(id(a)) # 1932373650496 a += [30] print(id(a)) # 1932373650496 a = a + [56] print(id(a)) # 1932375047232 a.append(45) print(id(a)) # 1932375047232
def add(p): print '進來時,p的id是',id(p) p+=[1] print 'p執(zhí)行p+=[1]運算后的值為:',p print '加法后p的id是:',id(p) a=[1,3,3,3] print 'a進入函數(shù)前的id是:',id(a) add(a) print 'a進入函數(shù)后的值是:',a print 'a進入函數(shù)后的id是:',id(a)
a進入函數(shù)前的id是: 116958664 進來時,p的id是 116958664 p執(zhí)行p=p+[1]運算后的值為: [1, 3, 3, 3, 1] 加法后p的id是: 116958664 a進入函數(shù)后的值是: [1, 3, 3, 3, 1] a進入函數(shù)后的id是: 116958664
a的值是變了的,因為列表是可變對象,’+=‘操作是直接在a所指向的對象上進行修改,并沒有產(chǎn)生新的引用。
def add(p): print '進來時,p的id是',id(p) p=p+[1] print 'p執(zhí)行p=p+[1]運算后的值為:',p print '加法后p的id是:',id(p) a=[1,3,3,3] print 'a進入函數(shù)前的id是:',id(a) add(a) print 'a進入函數(shù)后的值是:',a print 'a進入函數(shù)后的id是:',id(a)
a進入函數(shù)前的id是: 186860104 進來時,p的id是 186860104 p執(zhí)行p=p+[1]運算后的值為: [1, 3, 3, 3, 1] 加法后p的id是: 116958664 a進入函數(shù)后的值是: [1, 3, 3, 3] a進入函數(shù)后的id是: 186860104
發(fā)現(xiàn)a的值并沒有變,這是因為在執(zhí)行p=p+[1]時,有一個賦值動作’=‘,會產(chǎn)生一個新的對象,所以p這時已經(jīng)指向了別的對象,這也說明了python沒有賦值,它的賦值是產(chǎn)生一個新的對象。
>>> a=[1,2,3] >>> b=[1,2,3] >>> id(a),id(b) (45735624L, 45791816L) >>> a=a+[2] >>> id(a) 45793224L
a,b都是將[1,2,3]付給a,b,但是他們分別產(chǎn)生了新的對象(id不同)。
但是也有這樣的情況:
>>> a=3 >>> b=3 >>> strA='asd' >>> strB='asd' >>> id(a),id(b) (38102392L, 38102392L) >>> id(strA),id(strB) (45829736L, 45829736L)
發(fā)現(xiàn)他們的id一樣是不是,那是因為python對一些整型數(shù)字和字符串會進行緩存,使得他們id一樣,造成了他們沒有創(chuàng)建新對象的假象。
繼續(xù)剛才’=+‘與’+=‘的話題,一開始我們是使用的列表,如果現(xiàn)在我使用元組呢:
觀察結(jié)果:
’=+‘:
def add(p): print '進來時,p的id是',id(p) p=p+(1,) print 'p執(zhí)行p=p+(1,)運算后的值為:',p print '加法后p的id是:',id(p) a=(1,3,3) print 'a進入函數(shù)前的id是:',id(a) add(a) print 'a進入函數(shù)后的值是:',a print 'a進入函數(shù)后的id是:',id(a)
結(jié)果為:
a進入函數(shù)前的id是: 186690296 進來時,p的id是 186690296 p執(zhí)行p=p=p+(1,)運算后的值為: (1, 3, 3, 1) 加法后p的id是: 185401496 a進入函數(shù)后的值是: (1, 3, 3) a進入函數(shù)后的id是: 186690296
發(fā)現(xiàn)a一樣沒有發(fā)生改變,和a是list的情況一樣。
再看’+=‘:
def add(p): print '進來時,p的id是',id(p) p+=(1,) print 'p執(zhí)行p+=(1,)運算后的值為:',p print '加法后p的id是:',id(p) a=(1,3,3) print 'a進入函數(shù)前的id是:',id(a) add(a) print 'a進入函數(shù)后的值是:',a print 'a進入函數(shù)后的id是:',id(a)
a進入函數(shù)前的id是: 186690656 進來時,p的id是 186690656 p執(zhí)行p+=(1,)運算后的值為: (1, 3, 3, 1) 加法后p的id是: 185401496 a進入函數(shù)后的值是: (1, 3, 3) a進入函數(shù)后的id是: 186690656
欸,怎么a為元組和a為列表的情況不一樣,現(xiàn)在a沒有發(fā)生變化。那是因為元組是不可變對象,在執(zhí)行p+=(1,)時,無法對p之前指向的對象進行本地操作,只能創(chuàng)建一個新對象了。
同樣的,字符串等不可變對象也是會產(chǎn)生一個新對象:
如:
>>> a="sd" >>> id(a) 45643056L >>> a+='***' >>> id(a) 45829016L
好了,總結(jié)一下就是:
1,python的賦值會產(chǎn)生一個新對象
2,執(zhí)行’=+‘操作時會產(chǎn)生一個新對象
3,執(zhí)行’+=‘操作時,對于可變對象,例如列表,其會對原對象進行本地修改值,不會產(chǎn)生新對象,而對于不可變對象,則會還是會產(chǎn)生新的對象。
————————————————
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/jiruiYang/article/details/53019991

浙公網(wǎng)安備 33010602011771號