【转】Python中的可变对象和不可变对象

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

不可变(immutable):int、字符串(str)、float、(数值型number)、元组(tuple)、None(空)

可变(mutable):字典型(dictionary)、列表型(list), set(集合)

 

廖雪峰博客:”为什么要设计strNone这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。“

 

一、不可变对象

由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的。运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。如下面的代码:

i = 73
i += 2

从上面得知,不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用

>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True

如上所示,因为整数为不可变,x,y,z在内存中均指向一个值为1的内存地址,也就是说,x,y,z均指向的是同一个地址,值得注意的是,整形来说,目前仅支持(-1,100)。

  总结一下,不可变对象的优缺点。

    优点是,这样可以减少重复的值对内存空间的占用

    缺点呢,如例1所示,我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

第三个例子

a='abc'
d={a:100}
print(d)
a=a.replace('a','A')
print(a)
print(d['abc'])
print(d)
print(d[a])

 

执行结果为

d={a:100}这一句执行完后,存入dict的是a指向的对象,即'abc',而不是a变量本身。
之后a=a.replace('a','A')这一句将a变量指向了新的对象('Abc')
此时print(a)显然输出的是
'Abc',而由于dict里面存入的key依然是'abc',所以以'abc'作为key查找依然可以得到结果,但是如果此时用a变量所指的对象('Abc')来查询dict便会报错了。
参考地址:http://blog.csdn.net/taohuaxinmu123/article/details/39008281
posted @ 2015-10-29 12:30  KIWI的博客  阅读(3790)  评论(0编辑  收藏  举报