python - 元组与字符串与卡住集。不可变对象(immutable对象)和内存中的副本数量

标签 python immutability

a = "haha"
b = "haha"
print a is b  # this is True

上面的代码打印 true。我读到,这样做的原因之一是因为字符串是不可变的,所以内存中的一份副本就足够了。但对于元组的情况:

a = (1, 2, 3)
b = (1, 2, 3)
print a is b  # this is False

尽管元组在 python 中也是不可变的,但它会打印 False。经过更多研究后,我发现元组可以包含可变元素,因此我认为如果确定元组是否包含可变对象的成本太高,那么在内存中拥有元组的多个副本是有意义的。但是当我在 freezeset 上尝试时

a = frozenset([1,2])
b = frozenset([1,2])
print a is b  # False

这也会打印 false。据我所知,frozenset 本身是不可变的,并且只能包含不可变对象(immutable对象)(我尝试创建一个 freezeset,其中包含一个包含可变列表的元组,但这是不允许的),并且我们可以使用 == 来检查两个 freezeset 是否是值相同,那么为什么 python 在内存中创建它们的两个副本?

最佳答案

你的句子“我读到,造成这种情况的原因之一是因为字符串是不可变的,所以内存中的一份副本就足够了。”是正确的,但并不总是正确的。 例如,如果您对字符串执行相同的操作 “dgjudfigur89tyur9egjr9ivr89egre8frejf9reimfkldsmgoifsgjurt89igjkmrt0ivmkrt8g,rt89gjtrt” 它不会是同一个对象(至少在我的 python 版本上)。 同样的现象可以用整数来复制,其中 256 是同一个对象,但 257 不是。 它与 python 缓存对象的方式有关,它保存“简单”对象。每个对象都有其标准,对于字符串,它仅包含某些字符,对于整数,它的范围。

关于python - 元组与字符串与卡住集。不可变对象(immutable对象)和内存中的副本数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33046907/

相关文章:

python - 在通过管道读取标准输入的脚本中使用 pdb.set_trace()

Python 舍入不一致

java - 为什么首选使用不可变对象(immutable对象)作为 Set 的元素?

data-structures - 将 Haskell Edison API 和 Core 移植到 F# 有什么好处吗?

java - 无法解析符号 'Immutable'

javascript - Immutability 和 Singleton 解决的是同一个目的吗?

python - 带有brew的OS X上的virtualenv中的PyGame?

python - 使用 PySpark 将复杂 RDD 转换为扁平化 RDD

python - 将 Curl "-I --user"转换为 Python 请求

java - 这个类是线程安全的吗?