gpt4 book ai didi

python - 不可变对象(immutable对象)的内存分配

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:59 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com