淺談Python中的可變對(duì)象和不可變對(duì)象

總所周知,Python中一切皆對(duì)象(object),都可以使用Python內(nèi)置的type()id()對(duì)其進(jìn)行追蹤。而在對(duì)象中,可以根據(jù)可變和不可變將其分為可變對(duì)象和不可變對(duì)象。

在Python中,常見(jiàn)的可變類型有list,dict,常見(jiàn)的不可變類型有數(shù)字(int, float),字符串(string)和tuple

不可變類型

先來(lái)看個(gè)例子:

>>> a = 1
>>> id(a)
30702344L
>>> a = 2
>>> id(a)
 30702320L
>>> id(1)
30702344L
>>> id(a+1)
 30702320L
>>> id(a+1) == id(3)
True
>>> string1 = 'Hello, World! Welcome to see Python's World'
>>> string2 = 'Hello, World! Welcome to see Python's World'
>>> id(string1) == id(string2)
True

可見(jiàn),對(duì)于所有值為3的數(shù),其在內(nèi)存空間中指向的是同一片空間。而當(dāng)變量值改變之后,其指向的空間也就發(fā)生了改變 這就是不可變的含義。

需要注意的是字符串(string)是不可變類型,但字符卻不是不可變類型。可以看下面的例子:

>>> char1 = 'a'
>>> string1 = 'Hello, Python!'
>>> id(string1) == id('Hello, Python!')
True
>>> id(char1) == id('a')
False

可變類型

先來(lái)看個(gè)例子:

>>> list1 = [1,2]
>>> id(list1)
39504200L
>>> list1.append(3)
[1,2,3]
>>> id(list1)
39504200L

可見(jiàn)當(dāng)list發(fā)生變化時(shí),變量所指向的內(nèi)存空間并沒(méi)有發(fā)生變化。

可變,不可變的影響、區(qū)別

>>> def test1(somearg = []):
···        somearg.append(7)
···        print somearg
>>> def test2(somearg = 0):
···        somearg += 1
```        print somearg
>>> for _ in range(3):
···        test1()
···        test2()
[7]
1
[7, 7]
1
[7, 7, 7]
1 

在這個(gè)例子中對(duì)于默認(rèn)參數(shù)somearg = []的處理方式顯然不是我們所期望的,它實(shí)質(zhì)上并沒(méi)有在每次運(yùn)行時(shí)準(zhǔn)備一個(gè)全新的空list,那我們應(yīng)該怎么處理呢?

>>> def test1(somearg = None):
···        if not somearg:
···            somearg = []
```        somearg.append(7)
```        print somearg
>>> for _ in range(3):
···        test1()
[7]
[7]
[7]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容