提问人:2xB 提问时间:8/19/2019 最后编辑:2xB 更新时间:8/19/2019 访问量:136
如何在Python中调用默认的字符串相等函数?
How to call the default string equality function in Python?
问:
我假设:
import numpy as np
a = np.array(["a", "b", "c"])
print(a == "abc")
print("abc" == a)
输出
[False False False]
False
,因为后一种比较应该对字符串使用相等的定义,而前者应该对 NumPy 数组使用相等的定义。
实际输出为:
[False False False]
[False False False]
为什么会发生这种情况[1]以及如何预防[2]?
[1] 即为什么是?str.__eq__
NotImplemented
[2] 也就是说,如果不实现,如何调用已执行的相等性检查?np.ndarray.__eq__
[编辑]这个问题被标记为可能与比较字符串 1-d numpy 数组元素重复,但事实并非如此,因为那里提出了完全相反的问题(基本上是如何使用),并且根本没有讨论 [1] 和 [2]。np.ndarray.__eq__
答:
我将简要介绍一下正在发生的事情:
表达式将首先调用,但如果传递的参数不是类型,则将返回。作为后备,Python 将改为调用。将比较委托给另一个对象上的反射方法的原因是,该对象可能实际实现了它。'abc' == a
'abc'.__eq__(a)
str.__eq__
NotImplemented
str
a.__eq__('abc')
在这种情况下,实际上可以通过逐个元素进行比较来处理字符串,并返回 .根据数据模型文档,这是可以接受的:方法不需要返回值。无论变量在相等中的位置如何,都会发生此行为。np.array.__eq__
[False, False, False]
__eq__
bool
现在,具体回答您的问题:
- 为什么 ?
str.__eq__
NotImplemented
这只是 的预期行为,如文档所述:str.__eq__
不同类型的对象,除了不同的数值类型外,永远不会相等
换句话说,仅针对参数实现。将类型与不同类型的其他对象进行比较需要某种隐式类型转换,这将违背 Python 的禅宗:str.__eq__
str
str
显式比隐式好
- 如果不执行,如何调用已执行的相等性检查?
np.ndarray.__eq__
如果等式的两边都没有实现,Python将进行最后的回退,以比较两个对象的内存中的地址。这将返回,就像每个调用将返回一个 一样,每个对象都会有所不同。因此,如果这是您需要的,您可以使用。__eq__
id(a) == id('abc')
False
id
int
id(a) == id('abc')
评论
a = "abcd"[0:3]; b = "abc"; print(a == b); print(id(a) == id(b))
True\nFalse
"abcd"[0:3]
"abc"
str
str.__eq__
id
id
id
id("abcd"[0]) == id("a")
str.__eq__
NotImplemented
评论