Python 如何确定 == 的操作数优先级?
How does Python determine operand precedence for ==?
比较 list
s 与 ==
运算符 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
的机制有关,而不是 numpy
或 list
.
丰富的比较运算符总是首先询问左操作数(除非右操作数是左操作数类型的子类的实例;这里不是这种情况)。如果第一个操作数检查了 returns NotImplemented
(list
在与 numpy
数组进行比较时总是会这样做,因为它不可能将它们的知识嵌入到核心中解释器),然后要求第二个操作数执行反射比较(__eq__
不会改变)。
由于 numpy
将 list
的知识融入其 __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 在评估涉及 and
或 or
运算符的表达式时使用短路。使用这些运算符时,Python 不会计算第二个操作数,除非有必要解析结果。这允许 if (s != None)
和 (len(s) < 10): ...
等语句可靠地工作。
year % 4 == 0 and year % 100 != 0 or year % 400 == 0
比较 list
s 与 ==
运算符 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
的机制有关,而不是 numpy
或 list
.
丰富的比较运算符总是首先询问左操作数(除非右操作数是左操作数类型的子类的实例;这里不是这种情况)。如果第一个操作数检查了 returns NotImplemented
(list
在与 numpy
数组进行比较时总是会这样做,因为它不可能将它们的知识嵌入到核心中解释器),然后要求第二个操作数执行反射比较(__eq__
不会改变)。
由于 numpy
将 list
的知识融入其 __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 在评估涉及 and
或 or
运算符的表达式时使用短路。使用这些运算符时,Python 不会计算第二个操作数,除非有必要解析结果。这允许 if (s != None)
和 (len(s) < 10): ...
等语句可靠地工作。
year % 4 == 0 and year % 100 != 0 or year % 400 == 0