如何在Python中调用默认的字符串相等函数?

How to call the default string equality function in Python?

提问人:2xB 提问时间:8/19/2019 最后编辑:2xB 更新时间:8/19/2019 访问量:136

问:

我假设:

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-3.x 运算符 相等

评论

1赞 shuberman 8/19/2019
按元素比较字符串 1-d numpy 数组的可能重复

答:

5赞 Tomas Farias 8/19/2019 #1

我将简要介绍一下正在发生的事情:

表达式将首先调用,但如果传递的参数不是类型,则将返回。作为后备,Python 将改为调用。将比较委托给另一个对象上的反射方法的原因是,该对象可能实际实现了它。'abc' == a'abc'.__eq__(a)str.__eq__NotImplementedstra.__eq__('abc')

在这种情况下,实际上可以通过逐个元素进行比较来处理字符串,并返回 .根据数据模型文档,这是可以接受的:方法不需要返回值。无论变量在相等中的位置如何,都会发生此行为。np.array.__eq__[False, False, False]__eq__bool

现在,具体回答您的问题:

  • 为什么 ?str.__eq__NotImplemented

这只是 的预期行为,如文档所述:str.__eq__

不同类型的对象,除了不同的数值类型外,永远不会相等

换句话说,仅针对参数实现。将类型与不同类型的其他对象进行比较需要某种隐式类型转换,这将违背 Python 的禅宗:str.__eq__strstr

显式比隐式好

  • 如果不执行,如何调用已执行的相等性检查?np.ndarray.__eq__

如果等式的两边都没有实现,Python将进行最后的回退,以比较两个对象的内存中的地址。这将返回,就像每个调用将返回一个 一样,每个对象都会有所不同。因此,如果这是您需要的,您可以使用。__eq__id(a) == id('abc')Falseidintid(a) == id('abc')

评论

0赞 2xB 8/19/2019
默认字符串比较不是按 id 进行比较:例如 prints 。a = "abcd"[0:3]; b = "abc"; print(a == b); print(id(a) == id(b))True\nFalse
1赞 Tomas Farias 8/19/2019
和 都是类型,默认字符串与字符串参数的比较是 。不会进行比较。比较失败,因为它正在比较内存中的地址,这些地址对于字符串等不可变类型可能相同,也可能不同(例如:单个字符字符串将具有相同的 : )。"abcd"[0:3]"abc"strstr.__eq__idididid("abcd"[0]) == id("a")
1赞 2xB 8/19/2019
啊,只给非字符串类型!这向我解释了。谢谢。str.__eq__NotImplemented