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

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

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

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

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

一、不可变对象

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

i = 73i+= 2

804977-20151029105550904-900268555.png

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

>>>x = 1

>>>y = 1

>>>x = 1

>>> x isy

True>>>y isz

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])

执行结果为

804977-20151029122130529-1477532007.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值