Python 如何确定 == 的操作数优先级?

How does Python determine operand precedence for ==?

比较 lists 与 == 运算符 returns a bool.

>>> [0,0,0] == [0,1,0]
False

numpy 数组与 == 运算符进行比较 returns 另一个由元素明智比较产生的数组。

>>> np.array([0,0,0]) == np.array([0,1,0])
array([ True, False,  True])

如果我混合操作数类型,numpy 方法总是优先。

>>> np.array([0,0,0]) == [0,1,0]
array([ True, False,  True])
>>> [0,0,0] == np.array([0,1,0])
array([ True, False,  True])

Python如何确定哪个操作数具有优先权?我的问题与 Python 的机制有关,而不是 numpylist.

丰富的比较运算符总是首先询问左操作数(除非右操作数是左操作数类型的子类的实例;这里不是这种情况)。如果第一个操作数检查了 returns NotImplementedlist 在与 numpy 数组进行比较时总是会这样做,因为它不可能将它们的知识嵌入到核心中解释器),然后要求第二个操作数执行反射比较(__eq__ 不会改变)。

由于 numpylist 的知识融入其 __eq__,并且 list 没有融入 numpy 数组的知识,numpy 要么先走并立即使用自己的逻辑(当它是左操作数时),要么 list 先走(当它是左操作数时),通过返回 NotImplemented 放弃,然后返回 numpy__eq__ 做出最后决定。

left == right 调用的粗略内部结构(省略子类特殊情况):

attempt = type(left).__eq__(left, right)
if attempt is NotImplemented:
   attempt = type(right).__eq__(right, left)
   if attempt is NotImplemented:
       attempt = False  # Specific to __eq__, if both can't compare, returns False
return attempt

有关完整详细信息,请从 the NotImplemented docs 开始并沿着黄砖路走(阅读:链接)。

在Python中,左操作数总是在右操作数之前求值。这也适用于函数参数。

Python 在评估涉及 andor 运算符的表达式时使用短路。使用这些运算符时,Python 不会计算第二个操作数,除非有必要解析结果。这允许 if (s != None)(len(s) < 10): ... 等语句可靠地工作。

year % 4 == 0 and year % 100 != 0 or year % 400 == 0