码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-10-29 13:21:12      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

一、不可变对象

由于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

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

标签:

原文地址:http://www.cnblogs.com/kiwibird/p/4920120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!