在python中一切皆對象。在Python中不存在所謂的值傳遞調(diào)用,一切傳遞都是對象的引用,也可認為是傳址。
python中,對象分為可變(mutable)和不可變(immutable)兩種類型,元組(tuple)、數(shù)值型(number)、字符串(string)均為不可變對象,而字典型(dictionary)和列表型(list)的對象是可變對象。
不可變對象
見一個例子,分析不可變對象的特點
python內(nèi)置id()函數(shù),用于返回對象的唯一標(biāo)識(identity)。id()返回的是十進制,對象實際內(nèi)存地址為hex(id(object)),本文中將id()與hex(id())等價使用。
>>>a=1#將變量a與內(nèi)存中的值為1的內(nèi)存綁定在一起
>>>a=2#將變量a與內(nèi)存中值為2的內(nèi)存綁定在一起,并不是修改原來a綁定的內(nèi)存中的值,
#這時,原來的這個值為1的內(nèi)存地址的引用次數(shù)減一,當(dāng)引用計數(shù)為0時,內(nèi)存地址被回收
>>>b=a#變量b綁定與a一樣的內(nèi)存
>>>id(b),id(a)#打印a,b的綁定的內(nèi)存地址
(1972461824,1972461824)
>>>b=3#創(chuàng)建一個內(nèi)存值為3的內(nèi)存地址與變量名字b進行綁定。這時,a還是指向值為2的內(nèi)存地址
>>>a,b
(2,3)
>>>id(b),id(a)#打印a,b的綁定的內(nèi)存地址
(1972461856,1972461824)
>>>x=1
>>>y=1
>>>z=1
>>>xisy
True
>>>yisz
True
>>>id(x),id(y),id(z)
(1972461792,1972461792,1972461792)
從第二個例子可看出因為整數(shù)為不可變對象,x,y,z在內(nèi)存中均指向一個值為1的內(nèi)存地址。
不可變對象最大的優(yōu)點便是減少重復(fù)的值對內(nèi)存空間的占用。
缺點便是如第一個例子中所示,我要修改這個變量綁定的值,如果內(nèi)存中沒有存在該值的內(nèi)存塊,那么必須重新開辟一塊內(nèi)存,把新地址與變量名綁定。
而不是修改變量原來指向的內(nèi)存塊的值,這回給執(zhí)行效率帶來一定的降低。
原來的內(nèi)存塊會因變量與其他內(nèi)存塊綁定而引用次數(shù)減1.
以上內(nèi)容為大家介紹了python的不可變對象,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。