您的位置:首页 > 编程语言 > Python开发

python 可变 与 不可变类型

2014-05-09 12:08 281 查看
一、Python对象
见《Python 核心编程》

二、可变与不可变
python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).

我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。

不可变类型:string,integer,tuple

>>> var1 = 1

>>> var2 = var1

>>> var1,var2

(1, 1)

>>> id(var1),id(var2) #同指同一内存区域,id相同

(21200672, 21200672)

>>> var1 += 1

>>> var1,var2

(2, 1)

>>> id(var1),id(var2)#由于var1,var2数据不可变的,对var1+1后,申请另外一块区域,id(var1)变了,id(var2)不变,对此区域ref数字-1

(21200660, 21200672)

>>>

可变类型:list,dict

>>> lst1 = [1,2,3]

>>> lst2 = lst1

>>> lst1,lst2

([1, 2, 3], [1, 2, 3])

>>> id(lst1),id(lst2)

(28497360, 28497360)

>>> lst1.append(4)#可变类型的,append后,address会保持不变

>>> lst1,lst2

([1, 2, 3, 4], [1, 2, 3, 4])

>>> id(lst1),id(lst2)#lst1,lst2一直指向同一区域

(28497360, 28497360)

>>>

在操作这种类型的时候要特别小心,dict的key不用可变类型的,函数传参的时候不用可变类型的。

eg:

>>> def dis(arg=[]):

... arg.append('1')

... print arg

...

>>> dis()

['1']

>>> dis()

['1', '1']

>>> dis()

['1', '1', '1']

>>>

参考copy模块,了解更多。

参考:http://blog.chinaunix.net/uid-26249349-id-3080279.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: