不可变对象的内存分配

时间:2018-01-08 05:19:36

标签: python tuples immutability

对于字符串类型,相同值的内存位置相同。但是,不是为了元组。有什么理由吗?我期待元组和具有相同数据的字符串具有相同的内存位置,因为它们都是不可变的。

name1 = "praveen"
print(id(name1))

name2 = "praveen"
print(id(name2))

tuple1 = (1, 2, 3)
print(id(tuple1))

tuple2 = (1, 2, 3)
print(id(tuple2))
140568068832368
140568068832368
140568038719704
140568038719848

1 个答案:

答案 0 :(得分:4)

这种优化是依赖于实现的。更复杂的编译器/拦截器可以实现更多优化方法。但是,编译器/拦截器必须考虑每次优化的权衡。

在我看来:

  

有什么理由吗?

检测相同的字符串既简单又快速,可以通过字符串哈希等进行更优化。非常快。此方法通常称为“字符串池”。

检测相同的元组既困难又缓慢,尤其是当元组包含大对象时。检测相同元组的成本可能比节省内存的好处浪费更多时间。

  

我期待元组和具有相同数据的字符串具有相同的内存位置,因为它们都是不可变的。

编译器/拦截器必须首先检测相同的对象(字符串,元组),然后再使用不可变的现有对象。如果Python无法检测到相同的元组,则他不会使用现有的相同元组。如前所述,Python可能会认为成本太高而无法检测到复杂的元组,所以他放弃了。

对于空元组,python很好,因为他知道它,很容易:)

>>> a=()
>>> b=()
>>> id(a)
4553994312
>>> id(b)
4553994312
>>>