【问题标题】:In python, why 'is' is preferred over '==' for checking if object in None [duplicate]在python中,为什么'is'优于'=='来检查对象是否为None [重复]
【发布时间】:2015-09-24 22:11:17
【问题描述】:

如果我这样写:

if x == None:
    x = 1

我的 pyCharm 编辑器一直建议我应该使用 'is' 而不是 '==':

if x is None:
    x = 1

对于任何其他相等性检查,pyCharm 不建议使用 'is',例如:

if x == 2:
    x = 1

在检查对象是否为None 时,为什么'is' 运算符优于'==' 运算符?

为什么它只适用于None

【问题讨论】:

  • 请注意,您经常会看到 if x: 使用在应该使用 if x is not None: 的位置,这可能会导致其他 false-y 值出现问题。

标签: python python-2.7 comparison pycharm nonetype


【解决方案1】:

因为None 是一个单例,所以在Python 程序中只有一个该对象的副本。

is 在针对单个对象进行测试时更快,因为只有指针需要相等。 == 测试以获取更多信息,测试对象的状态在这种情况下也需要相同。

如果您的x 对象实现了自定义object.__eq__() method,这将变得更加明显;每次使用x == None 时都会调用它,而x is None 没有这样的钩子。这意味着每次进行相等性测试时,解释器都必须执行更多的 Python 代码。我是否已经提到过简单的指针相等测试(用于is)很快?

这个钩子还可以让自定义类型声明自己等于None

class Devious(object):
    def __eq__(self, other):
        return other is None

现在您的x == None 测试将为真,即使x 实际上不是None,而是Devious 的一个实例。如果您真的想知道x 是否设置为None,则只有x is None 能够检测到这种情况。

None 不是唯一可以测试身份的对象。任何时候您需要知道给定名称是否引用特定对象而不是,您应该使用is

例如,有时您需要允许None 是一个有效值,但您想检测是否没有指定值。通常你可以使用None 作为哨兵来检测参数是否被遗漏:

def foo(arg1, optional=None):
    if optional is None:
        # no value given for optional

但如果您希望 None 成为有效值,您将使用不同的标记

_sentinel = object()

def foo(arg1, optional=_sentinel):
    if optional is _sentinel:
        # no value given for optional

现在您可以使用foo(1, None),它会被正确地视为一个值。

【讨论】:

  • 此外,is 检查身份并且不能被覆盖,而==!= 是可以使用__eq__()__ne__() 重载的运算符。
猜你喜欢
  • 2018-11-29
  • 2016-12-29
  • 2017-08-06
  • 2021-07-17
  • 2014-06-29
  • 1970-01-01
  • 2020-10-05
  • 2023-03-02
  • 2017-03-20
相关资源
最近更新 更多