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

标签 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

最佳答案

此类优化取决于实现。更复杂的编译器/拦截器可以实现更多的优化方法。但是,编译器/拦截器必须考虑每个优化的权衡。

我认为:

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/

相关文章:

C#:如何高效地将 "Immutable by default"引入C#?不可变属性?

rust - 有没有办法以有意义的方式声明变量不可变?

python - scons:在 scons 之前运行一些脚本

python - wxPython 弹出通知

python - 使用 lambda 排序函数按每个元组组合值对字符串元组进行排序

python - 将逗号分隔的字符串分配给元组数组 - python, numpy

javascript - 我什么时候应该使用 icepick.merge 而不是 lodash.merge

python - 如何在 Python 中查找字符串中的 x

python - (-215:声明失败)number <max_number在函数 'cv::icvExtractPattern'中出错吗?

c++ - 将元组和整数实例合并到引用元组中