除了琐碎的数据类型,Python不可变对象ID是否相同?

问题描述 投票:0回答:1

对于不可变数据类型,Python不保证两种构造会导致两个不同的对象;这样,1+1 is 2可能会也可能不会返回True。当然,mutable类型do会导致单独的对象:[] is []将始终返回False

>>> "abc" is "abc"
True
>>> [] is []
False
>>> 1 + 1 is 2
True

现在,除了普通类型intfloatboolstring,我希望tuplefrozenset表现出相同的行为。

但是我发现没有这样做的情况:

>>> {1, 2} is {1, 2}
False
>>> (1, ) is (1, )
False

是否有任何实现为单独的不可变对象产生相同的ID?

python optimization immutability inequality
1个回答
0
投票

这些对象的所有is相等性都是由解释器技巧产生的(这些技巧不属于语言规范AFAIK,而是cypython的后果)

例如(带有int)。

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上实际上是返回对现有对象的引用。因此应该可以更改1的值。我怀疑在这种情况下Python的行为是不确定的。 :-)

([reference

并且对于字符串,python执行interning

在python3.8中,interning(1,) is (1,)actually由于3.8中文字评估的变化。

True

并附带警告>>> (1,) is (1,) <stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="? True 用于文字。但是,分配变量并执行比较为False(符合预期)。

注意istuple() is tuple()都返回True。但是,它们的可变对象(frozenset() is frozenset()list)不具有此属性。

© www.soinside.com 2019 - 2024. All rights reserved.