【轉】Python中的可變對象和不可變對象


python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內容是可變的,例如list。而不可變的對象則相反,表示其內容不可變。

不可變(immutable):int、字符串(str)、float、(數值型number)、元組(tuple)、None(空)

可變(mutable):字典型(dictionary)、列表型(list), set(集合)

 

廖雪峰博客:”為什么要設計strNone這樣的不變對象呢?因為不變對象一旦創建,對象內部的數據就不能修改,這樣就減少了由於修改數據導致的錯誤。此外,由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。“

 

一、不可變對象

由於Python中的變量存放的是對象引用,所以對於不可變對象而言,盡管對象本身不可變,但變量的對象引用是可變的。運用這樣的機制,有時候會讓人產生糊塗,似乎可變對象變化了。如下面的代碼:

i = 73
i += 2

從上面得知,不可變的對象的特征沒有變,依然是不可變對象,變的只是創建了新對象,改變了變量的對象引用

>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True

如上所示,因為整數為不可變,x,y,z在內存中均指向一個值為1的內存地址,也就是說,x,y,z均指向的是同一個地址,值得注意的是,整形來說,目前僅支持(-1,100)。

  總結一下,不可變對象的優缺點。

    優點是,這樣可以減少重復的值對內存空間的占用

    缺點呢,如例1所示,我要修改這個變量綁定的值,如果內存中沒用存在該值的內存塊,那么必須重新開辟一塊內存,把新地址與變量名綁定。而不是修改變量原來指向的內存塊的值,這回給執行效率帶來一定的降低。

第三個例子

a='abc'
d={a:100}
print(d)
a=a.replace('a','A')
print(a)
print(d['abc'])
print(d)
print(d[a])

 

執行結果為

d={a:100}這一句執行完后,存入dict的是a指向的對象,即'abc',而不是a變量本身。
之后a=a.replace('a','A')這一句將a變量指向了新的對象('Abc')
此時print(a)顯然輸出的是
'Abc',而由於dict里面存入的key依然是'abc',所以以'abc'作為key查找依然可以得到結果,但是如果此時用a變量所指的對象('Abc')來查詢dict便會報錯了。
參考地址:http://blog.csdn.net/taohuaxinmu123/article/details/39008281


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM