創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、響應式網(wǎng)站開發(fā)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體。這篇文章運用簡單易懂的例子給大家介紹什么是Python可變對象和不可變對象,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在 Python 中一切都可以看作為對象。每個對象都有各自的 id, type 和 value。
一個對象可變與否就在于 value 值是否支持改變。
不可變對象
常見的不可變對象(immutable objects):
讓我們通過例子感受一下
例子
>>> x=1 >>> y=x >>> id(x)==id(y) True >>> id(1)==id(y) True
這里創(chuàng)建了兩個 int 對象,并且讓 x,y 指向同一個對象,然后我們試著修改一下 x,讓 x+1
>>>x=x+1
這個時候 x 的 id 值和 y 的 id 以及 1 的 id 還一樣嗎?
>>> x=x+1 >>> id(x)==id(y) False >>> id(x)==id(1) False >>> id(1)==id(y) True
從結(jié)果不難看出來,x 所指向的對象已經(jīng)改變了,但是 1 并沒有改變。這就是不可變對象,對于不可變對象來說,一旦創(chuàng)建之后就不允許被改變。
注意: 不可變并不嚴格等同絕對的不可變
>>> a=([1],2,3) >>> id(a) 4338862696 >>> id(a[0]) 4338949128 >>> a[0][0]=0 >>> id(a) 4338862696 >>> id(a[0]) 4338949128
從上面的例子不難看出,我們改變了 a[0] 的值,但是并沒有影響它的 id 值。一個不可變?nèi)萜鲗ο笕绻瑢勺儗ο蟮囊?,當后者的值改變時,前者的值也會改變;但是該容器仍屬于不可變對象,因為它的 id 值不會改變的。
可變對象
常見的可變對象(mutable objects):
同樣的通過例子感受一下
例子
>>> c = [1,2,3] >>> b = c >>> id(b)==id(c) True
創(chuàng)建兩個 list 對象,并且讓 c,d 指向同一個對象,然后我們試著修改一下 c
c[0]=4
這個時候在看一下兩個對象的 id 值是否一致
>>> id(c)==id(b) True
修改之后,c,d 仍然指向同一個對象,所以不難得出結(jié)論,對于一個可變對象來說,修改 value 值并不會對它的 id 造成任何影響
函數(shù)參數(shù)
對于可變對象和不可變對象,他們兩者在函數(shù)當作參數(shù)傳遞的時候表現(xiàn)也有所不同
例子
eg0
def update_list(nums_list): print(f'2 id:{id(nums_list)}') nums_list += [10] print(f'3 id:{id(nums_list)}') number_list = [5, 6] print(f'1:{number_list}, id:{id(number_list)}') update_list(number_list) print(f'4:{number_list}, id:{id(number_list)}')
看一下結(jié)果
1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id:4457707912
在看另外一個例子
eg1
def add_num(number): print(f'2:{id(number)}') number += 1 print(f'3:{id(number)}') num = 1 print(f'1:{num}, id:{id(num)}') add_num(num) print(f'4:{num}, id:{id(num)}')
看一下結(jié)果
1:1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416
有其他有些文章中,上面 eg0 被稱為引用傳遞,eg1 被稱為值傳遞。然而在官方文檔中,并沒有找到有關(guān)的這兩個名詞的任何內(nèi)容,或者這種方式并不是上述的兩者任意一種。
這里的重點是:對于可變對象,在函數(shù)中的值的改變,會導致對象改變;對于不可變對象,在函數(shù)中值的改變,對其不會造成任何影響
關(guān)于什么是Python可變對象和不可變對象就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。