2xB*_*2xB 1 python equality operators python-3.x
我会假设:
import numpy as np
a = np.array(["a", "b", "c"])
print(a == "abc")
print("abc" == a)
Run Code Online (Sandbox Code Playgroud)
输出
[False False False]
False
Run Code Online (Sandbox Code Playgroud)
,因为后者的比较应该为字符串使用相等的定义,而前者的比较应该为NumPy数组使用相等的定义。
实际输出为:
[False False False]
[False False False]
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况[1],如何防止这种情况发生[2]?
[1]即为什么str.__eq__ NotImplemented?
[2]也就是说,如果np.ndarray.__eq__不执行,如何调用执行的相等性检查?
[编辑]该问题被标记为与elementwise比较字符串1-d numpy数组可能重复,但不是,因为提出了完全相反的要求(基本上是如何使用np.ndarray.__eq__),并且[1]和[2]都不是讨论过。
我将简要介绍正在发生的事情:
该'abc' == a表达式将'abc'.__eq__(a)首先调用,但是如果传递了非类型的参数,str.__eq__则将返回该表达式。作为备用,Python将改为调用。将比较委托给另一个对象的方法的背后原因是因为该对象实际上可以实现它。NotImplementedstra.__eq__('abc')
在这种情况下,np.array.__eq__实际上可以通过逐个元素比较来处理字符串,然后返回[False, False, False]。根据数据模型docs,这是可以接受的:__eq__方法不需要返回bool值。无论变量在等式中的位置如何,都会发生此行为。
现在,专门回答您的问题:
str.__eq__ NotImplemented呢?str.__eq__正如文档所述,这仅仅是的预期行为:
除数字类型不同外,其他类型的对象绝不等于
换句话说,str.__eq__仅对str参数实现。将str类型与其他不同类型的对象进行比较将需要某种隐式类型转换,这与Python的Zen背道而驰:
显式胜于隐式
np.ndarray.__eq__不执行,如何调用执行的相等性检查?如果相等的两面都没有实现__eq__,Python将进行最后的回退,以id(a) == id('abc')比较两个对象的内存中的地址。这将返回只是False因为每个id调用将返回int,这将是为每个对象不同。因此,您可以使用id(a) == id('abc')所需的东西。