在python中,为什么’is’优先于’==’来检查None中的对象是否

参见英文答案 > What is the difference between “ is None ” and “ ==None ”                                    4个
>            Why does comparing strings using either ‘==’ or ‘is’ sometimes produce a different result?                                    15个
如果我写这个:

if x == None:
    x = 1

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

if x is None:
    x = 1

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

if x == 2:
    x = 1

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

为什么它仅适用于None?

解决方法:

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

测试单个对象时速度更快,因为只有指针需要相等. ==测试更多信息,在这种情况下,测试对象的状态也需要相同.

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

该钩子还使自定义类型可以声明自己等于None:

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

现在你的x == None测试将是真的,即使x实际上不是None,而是一个Devious的实例.如果你真的想知道x是否设置为None,只有x是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),它将被正确地视为一个值.

上一篇:python – 我什么时候应该使用None vs False?


下一篇:来自片段的android PopupWindow