python 可变对象和不可变对象

2014-08-13 by philokey

Python中没有变量,只有对象和名字。万物皆对象。 每个对象都包含一一个标准头,通过头部信息就可以明确知道其具体类型。 头信息由 "引用用计数" 和 "类型指针"组成,前者在对象被引用用时增加,超出作用用域或手工释放后减小,等于 0 时会被虚拟机回收 (某些被缓存的对象计数器永远不会为 0)。用

sys.getrefcount(name)

可以对象查看被引用次数

Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如list。而不可变的对象则相反,表示其内容不可变。

  • 不可变对象:int,string,float,tuple
  • 可变对象 :list,dictionary

不可变对象

对于不可变对象,尽管对象本身不可变,但名字的对象引用是可变的。

>>> a = 1005
>>> a = 1006 #1005的引用减1, 1006的引用加1,或者是创建的新的对象1006

#不可变对象字符串
>>> str = '12345678'
>>> print id(str), id(str+'a') #创建了新的对象
139891756752160 139891756752784

不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用。 不可变对象对于函数参数而已类似于传值调用

可变对象

#浅拷贝,类似与传引用
>>> a = [1,2,3]
>>> b = a
>>> b += [4]
>>> a
[1, 2, 3, 4]
#深拷贝可以将名字指向新的对象
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[1, 2, 3, 4]
>>> b.pop()
4
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3]

Comments