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/