2024-10-01 04:50:54 发布
网友
如果Python中的Python名称x引用了一个不可变的值,这两条语句是否返回相同的结果,并执行等效/相同的检查
x
x is Nonevsx == None
x is None
x == None
我找不到这个问题的确切副本,但也许它在其他地方仍然得到了含蓄的回答,但这里有一些相关的问题:
它与x的不变性无关None是一个单例,其中is和==返回相同的结果,除非x的类型定义了一个奇怪的__eq__方法。名称x与None绑定或未绑定到同一对象。如果不是,则标识检查将始终为False,而不管它是什么其他类型。相等性检查的结果取决于x类型,但将与大多数健全类的标识检查相同
None
is
==
__eq__
False
现在需要注意的是,虽然您不能重写is,因为这是由解释器完成的身份检查,但是您可以重写==。除了速度和一致性之外,这里还有一个玩具示例,说明为什么x is None比x == 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 () == None和None == Test()返回相同结果的原因与比较的计算方式有关,而且None没有定义显式的__eq__方法。通常,解释器对操作数调用type(left).__eq__(left, right)。如果左操作数的类型未定义__eq__或该方法返回NotImplemented,它将尝试type(right).__eq__(right, left)。只有当两者都失败时,它才会切换到内置的身份检查。由于None没有定义相等性检查,因此它将始终使用另一个对象定义的检查,然后再切换到标识检查
Test () == None
None == Test()
type(left).__eq__(left, right)
NotImplemented
type(right).__eq__(right, left)
它与
x
的不变性无关None
是一个单例,其中is
和==
返回相同的结果,除非x
的类型定义了一个奇怪的__eq__
方法。名称x
与None
绑定或未绑定到同一对象。如果不是,则标识检查将始终为False
,而不管它是什么其他类型。相等性检查的结果取决于x
类型,但将与大多数健全类的标识检查相同现在需要注意的是,虽然您不能重写
is
,因为这是由解释器完成的身份检查,但是您可以重写==
。除了速度和一致性之外,这里还有一个玩具示例,说明为什么x is None
比x == None
更可取:Test () == None
和None == Test()
返回相同结果的原因与比较的计算方式有关,而且None
没有定义显式的__eq__
方法。通常,解释器对操作数调用type(left).__eq__(left, right)
。如果左操作数的类型未定义__eq__
或该方法返回NotImplemented
,它将尝试type(right).__eq__(right, left)
。只有当两者都失败时,它才会切换到内置的身份检查。由于None
没有定义相等性检查,因此它将始终使用另一个对象定义的检查,然后再切换到标识检查相关问题 更多 >
编程相关推荐