为什么与单例(如None)的比较应始终使用is或is not?

6 投票
2 回答
1181 浏览
提问于 2025-04-18 17:20

在PEP 8标准中,这里,为什么会有这样的建议:“与像None这样的单例进行比较时,应该始终使用is或is not,而不是使用相等运算符”?

2 个回答

-2

这可能是出于性能考虑。使用is来比较时,是直接比较对象的身份(id),而不是调用对象的eq方法。

1

==!= 是用来比较两个东西是否相等的,它们会调用 __eq__ 这个方法来检查左边的东西和右边的东西是否是同一个对象。

isis not 是用来检查两个东西是否是同一个对象的,它们会查看左边和右边的东西是否指向同一个对象。

对于单例对象来说,使用身份测试更好,原因有:

  1. 它们可以防止其他对象模仿单例对象:

    class FakeNone:
        def __eq__(self, other):
            return other is None
    
    print FakeNone() is None        # False
    print FakeNone() == None        # True ... WHAT?
    
  2. 它们稍微快一点,因为不需要调用方法。

撰写回答