總所周知,Python中一切皆對(duì)象(object)兼丰,都可以使用Python內(nèi)置的type()
和id()
對(duì)其進(jìn)行追蹤玻孟。而在對(duì)象中,可以根據(jù)可變和不可變將其分為可變對(duì)象和不可變對(duì)象鳍征。
在Python中黍翎,常見的可變類型有list
,dict
,常見的不可變類型有數(shù)字(int, float)艳丛,字符串(string)和tuple
不可變類型
先來看個(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
可見匣掸,對(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
可變類型
先來看個(gè)例子:
>>> list1 = [1,2]
>>> id(list1)
39504200L
>>> list1.append(3)
[1,2,3]
>>> id(list1)
39504200L
可見當(dāng)list
發(fā)生變化時(shí),變量所指向的內(nè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ì)上并沒有在每次運(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]