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
时间: 2024-09-30 06:39:18