如果x是不可变的,那么命令“x为无”和“x==无”是否总是返回相同的结果?

2024-10-01 04:50:54 发布

您现在位置:Python中文网/ 问答频道 /正文

如果Python中的Python名称x引用了一个不可变的值,这两条语句是否返回相同的结果,并执行等效/相同的检查

x is Nonevsx == None

我找不到这个问题的确切副本,但也许它在其他地方仍然得到了含蓄的回答,但这里有一些相关的问题:


Tags: 名称nonereturnifis地方副本not
1条回答
网友
1楼 · 发布于 2024-10-01 04:50:54

它与x的不变性无关None是一个单例,其中is==返回相同的结果,除非x的类型定义了一个奇怪的__eq__方法。名称xNone绑定或未绑定到同一对象。如果不是,则标识检查将始终为False,而不管它是什么其他类型。相等性检查的结果取决于x类型,但将与大多数健全类的标识检查相同

现在需要注意的是,虽然您不能重写is,因为这是由解释器完成的身份检查,但是您可以重写==。除了速度和一致性之外,这里还有一个玩具示例,说明为什么x is Nonex == None更可取:

class Test:
    def __eq__(self, other):
        if other is None:
            return True
        return self is other
>>> Test() == None
True
>>> None == Test()
True
>>> Test() is None
False
>>> None is Test()
False

Test () == NoneNone == Test()返回相同结果的原因与比较的计算方式有关,而且None没有定义显式的__eq__方法。通常,解释器对操作数调用type(left).__eq__(left, right)。如果左操作数的类型未定义__eq__或该方法返回NotImplemented,它将尝试type(right).__eq__(right, left)。只有当两者都失败时,它才会切换到内置的身份检查。由于None没有定义相等性检查,因此它将始终使用另一个对象定义的检查,然后再切换到标识检查

相关问题 更多 >