对于字符串类型,相同值的内存位置相同。但是,不是为了元组。有什么理由吗?我期待元组和具有相同数据的字符串具有相同的内存位置,因为它们都是不可变的。
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
答案 0 :(得分:4)
这种优化是依赖于实现的。更复杂的编译器/拦截器可以实现更多优化方法。但是,编译器/拦截器必须考虑每次优化的权衡。
在我看来:
有什么理由吗?
检测相同的字符串既简单又快速,可以通过字符串哈希等进行更优化。非常快。此方法通常称为“字符串池”。
检测相同的元组既困难又缓慢,尤其是当元组包含大对象时。检测相同元组的成本可能比节省内存的好处浪费更多时间。
我期待元组和具有相同数据的字符串具有相同的内存位置,因为它们都是不可变的。
编译器/拦截器必须首先检测相同的对象(字符串,元组),然后再使用不可变的现有对象。如果Python无法检测到相同的元组,则他不会使用现有的相同元组。如前所述,Python可能会认为成本太高而无法检测到复杂的元组,所以他放弃了。
对于空元组,python很好,因为他知道它,很容易:)
>>> a=()
>>> b=()
>>> id(a)
4553994312
>>> id(b)
4553994312
>>>