对于不可变数据类型,Python不保证两种构造会导致两个不同的对象;这样,1+1 is 2
可能会也可能不会返回True
。当然,mutable类型do会导致单独的对象:[] is []
将始终返回False
。
>>> "abc" is "abc"
True
>>> [] is []
False
>>> 1 + 1 is 2
True
现在,除了普通类型int
,float
,bool
,string
,我希望tuple
和frozenset
表现出相同的行为。
但是我发现没有这样做的情况:
>>> {1, 2} is {1, 2}
False
>>> (1, ) is (1, )
False
是否有任何实现为单独的不可变对象产生相同的ID?
这些对象的所有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(符合预期)。
注意is
和tuple() is tuple()
都返回True。但是,它们的可变对象(frozenset() is frozenset()
和list
)不具有此属性。