比较类型/类时,使用'is'运算符而不是'=='运算符是否“安全”?

时间:2017-03-01 18:23:42

标签: python python-3.x class types subclass

我不认为这是重复的,因为我在比较类型的特定情况中询问is vs ==,但请告诉我我会删除这个问题。

我知道python中的is运算符实际上转换为id(type(a))==id(<type>);但到目前为止,我发现type(a) is <type>似乎可以给出可预测的结果。我的问题是,会使用is运算符产生意外结果(即类似'foo' is str返回False)?或者python是否将type类存储在可预测的位置,以便is始终提供与==相同的结果?我发现is在这种情况下更具可读性。

注意这种情况是,如果我没有处理继承的类/子类(在这种情况下isinstance适合)。

1 个答案:

答案 0 :(得分:1)

不,使用is总是做同样的事情,它比较(在(C)Python中)你提供的对象的地址。无法重新定义is,因此您始终可以获得相同的行为。

如果两个对象ab与其类型具有相同的对象,则使用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__)请使用==