对于字符串类型,相同值的内存位置是相同的。但是,不适用于元组。有什么理由吗?我期望具有相同数据的元组和字符串具有相同的内存位置,因为它们都是不可变的。
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
最佳答案
此类优化取决于实现。更复杂的编译器/拦截器可以实现更多的优化方法。但是,编译器/拦截器必须考虑每个优化的权衡。
我认为:
Is there any reason for it?
检测相同字符串既简单又快速,并且可以通过字符串哈希等进行更优化。非常快。这种方法通常称为“字符串池”。
检测相同的元组既困难又缓慢,尤其是当元组包含大对象时。检测相同元组的成本可能比节省内存的好处浪费更多的时间。
I was expecting the tuples and strings with the same data have the same memory location as both of them are immutable.
编译器/拦截器必须首先检测相同的对象(字符串、元组),然后让后面的对象使用不可变的现有对象。如果Python无法检测到相同的元组,他将不会使用现有的相同元组。正如之前所说,Python可能认为检测复杂元组的成本太高,所以放弃了。
对于空元组,python 做得很好,因为他知道,这很容易:)
>>> a=()
>>> b=()
>>> id(a)
4553994312
>>> id(b)
4553994312
>>>
关于python - 不可变对象(immutable对象)的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48144599/