詳細(xì)分析Python可變對(duì)象和不可變對(duì)象
在 Python 中一切都可以看作為對(duì)象。每個(gè)對(duì)象都有各自的 id, type 和 value。
id: 當(dāng)一個(gè)對(duì)象被創(chuàng)建后,它的 id 就不會(huì)在改變,這里的 id 其實(shí)就是對(duì)象在內(nèi)存中的地址,可以使用 id() 去查看對(duì)象在內(nèi)存中地址。 type: 和 id 一樣當(dāng)對(duì)象唄創(chuàng)建之后,它的 type 也不能再被改變,type 決定了該對(duì)象所能夠支持的操作 value: 對(duì)象的值一個(gè)對(duì)象可變與否就在于 value 值是否支持改變。
不可變對(duì)象
常見的不可變對(duì)象(immutable objects):
Number: int, float, complex string tuple frozenset:set 的另外一種類型讓我們通過(guò)例子感受一下
例子
>>> x=1>>> y=x>>> id(x)==id(y)True>>> id(1)==id(y)True
這里創(chuàng)建了兩個(gè) int 對(duì)象,并且讓 x,y 指向同一個(gè)對(duì)象,然后我們?cè)囍薷囊幌?x,讓 x+1
>>>x=x+1
這個(gè)時(shí)候 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é)果不難看出來(lái),x 所指向的對(duì)象已經(jīng)改變了,但是 1 并沒有改變。這就是不可變對(duì)象,對(duì)于不可變對(duì)象來(lái)說(shuō),一旦創(chuàng)建之后就不允許被改變。
注意: 不可變并不嚴(yán)格等同絕對(duì)的不可變
>>> 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 值。一個(gè)不可變?nèi)萜鲗?duì)象如果包含對(duì)可變對(duì)象的引用,當(dāng)后者的值改變時(shí),前者的值也會(huì)改變;但是該容器仍屬于不可變對(duì)象,因?yàn)樗?id 值不會(huì)改變的。
可變對(duì)象
常見的可變對(duì)象(mutable objects):
list dict set同樣的通過(guò)例子感受一下
例子
>>> c = [1,2,3]>>> b = c>>> id(b)==id(c)True
創(chuàng)建兩個(gè) list 對(duì)象,并且讓 c,d 指向同一個(gè)對(duì)象,然后我們?cè)囍薷囊幌?c
c[0]=4
這個(gè)時(shí)候在看一下兩個(gè)對(duì)象的 id 值是否一致
>>> id(c)==id(b)True
修改之后,c,d 仍然指向同一個(gè)對(duì)象,所以不難得出結(jié)論,對(duì)于一個(gè)可變對(duì)象來(lái)說(shuō),修改 value 值并不會(huì)對(duì)它的 id 造成任何影響
函數(shù)參數(shù)
對(duì)于可變對(duì)象和不可變對(duì)象,他們兩者在函數(shù)當(dāng)作參數(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:44577079122 id:44577079123 id:44577079124:[5, 6, 10], id:4457707912
在看另外一個(gè)例子
eg1
def add_num(number): print(f’2:{id(number)}’) number += 1 print(f’3:{id(number)}’)num = 1print(f’1:{num}, id:{id(num)}’) add_num(num)print(f’4:{num}, id:{id(num)}’)
看一下結(jié)果
1:1, id:43437684162 id:43437684163 id:43437684484:1, id:4343768416
有其他有些文章中,上面 eg0 被稱為引用傳遞,eg1 被稱為值傳遞。然而在官方文檔中,并沒有找到有關(guān)的這兩個(gè)名詞的任何內(nèi)容,或者這種方式并不是上述的兩者任意一種。
這里的重點(diǎn)是:對(duì)于可變對(duì)象,在函數(shù)中的值的改變,會(huì)導(dǎo)致對(duì)象改變;對(duì)于不可變對(duì)象,在函數(shù)中值的改變,對(duì)其不會(huì)造成任何影響
以上就是詳細(xì)分析Python可變對(duì)象和不可變對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于Python可變對(duì)象和不可變對(duì)象的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. JavaScript Tab菜單實(shí)現(xiàn)過(guò)程解析2. python opencv 實(shí)現(xiàn)讀取、顯示、寫入圖像的方法3. javascript設(shè)計(jì)模式 ? 建造者模式原理與應(yīng)用實(shí)例分析4. jsp+mysql實(shí)現(xiàn)網(wǎng)頁(yè)的分頁(yè)查詢5. ASP.NET MVC通過(guò)勾選checkbox更改select的內(nèi)容6. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)7. Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考8. Android實(shí)現(xiàn)圖片自動(dòng)切換功能(實(shí)例代碼詳解)9. 使用AJAX(包含正則表達(dá)式)驗(yàn)證用戶登錄的步驟10. 存儲(chǔ)于xml中需要的HTML轉(zhuǎn)義代碼
