我不认为这是重复的,因为我在比较类型的特定情况中询问is
vs ==
,但请告诉我我会删除这个问题。
我知道python中的is
运算符实际上转换为id(type(a))==id(<type>)
;但到目前为止,我发现type(a) is <type>
似乎可以给出可预测的结果。我的问题是,会使用is
运算符产生意外结果(即类似'foo' is str
返回False
)?或者python是否将type
类存储在可预测的位置,以便is
始终提供与==
相同的结果?我发现is
在这种情况下更具可读性。
注意这种情况是,如果我没有处理继承的类/子类(在这种情况下isinstance
适合)。
答案 0 :(得分:1)
不,使用is
总是做同样的事情,它比较(在(C)Python中)你提供的对象的地址。无法重新定义is
,因此您始终可以获得相同的行为。
如果两个对象a
和b
与其类型具有相同的对象,则使用type(a) is type(b)
将始终返回True
。相反,如果type(a) is type(b)
保证其类型匹配。
==
可能会导致意外结果,如果有人来到这里并定义一个愚蠢的__eq__
:
class MetaFoo(type):
def __eq__(self, other):
return False
class Foo(metaclass=MetaFoo):
pass
f1, f2 = Foo(), Foo()
现在:
type(f1) == type(f2)
False
但:
type(f1) is type(f2)
True
人们不会做那样的事情,但这很愚蠢。因此type(f1) == type(f2)
不保证任何内容(非内置插件,即)。
一般情况下,如果您关心它们是完全相同的对象(如评论中所述),请使用is
,如果您关心它们的设计行为方式相同(您期望的那样)要实施的等效__eq__
)请使用==
。