我对Python对象非常困惑'内存中的分配。似乎预定义类型的分配并不是一致的。以下是我对这个问题的思考的产物:
a = None
b = None
print( a, b is a) # it outputs True, one single instance of None
a = 'a'
b = 'a'
print( a, b is a) # it outputs True, one single instance of a string
a = 2
b = 2
print( a, b is a) # it outputs True, one single instance of an int
a = 2.5
b = 2.5
print( a, b is a) # it outputs True, one single instance of a float
# from the python command line 'b is a' returns False
a = 'a b'
b = 'a b'
print( a, b is a) # it outputs True, one single instances of the same string
# from the python command line 'b is a' returns False
a = ()
b = ()
print( a, b is a) # it outputs True, one single instance of a ()
a = {}
b = {}
print( a, b is a) # it outputs False, two different instances of the same empty {}
a = []
b = []
print( a, b is a) # it outputs False, two different instances of the same []
id
和a
的{{1}}返回值表明b
运算符正常运行但内存使用优化'算法似乎工作不一致。
最后两个is
输出和python命令行解释器行为是否暴露了某些实现错误,或者Python是否应该以这种方式运行?
我在OpenSUSE 13.1环境中运行了这些测试。使用Python 2.7.6和Python 3.3.5(默认情况下, 2014年3月27日,17:16:46)[GCC] on linux。
除了命令行和程序之间的输出差异外,这种优化的原因是什么?我认为假设程序平均可以节省10%以上的内存是非常乐观的,除非我们考虑应该由程序员直接管理的特殊情况。
此行为是否有助于有效减少内存碎片?
答案 0 :(得分:2)
这里的区别仅在于其中一些对象是可变的,有些是不可变的。
将分配优化到例如,是完全安全的。字符串文字,因为对同一个不可变对象的两次引用不会引起任何问题。由于您无法就地更改对象,因此任何更改都将表示与旧对象分开的新对象。
但是,对于像列表这样的可变类型,如果设置a = b
,可能会遇到麻烦。可变对象可以就地更改,因此在列表示例中,您添加到a
的任何内容都会以b
结尾,反之亦然。
解释器中的行为是不同的(除了小的整数,这是“实习”),因为这些优化没有被执行:
>>> a = "a b"
>>> b = "a b"
>>> a is b
False