總所周知,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]