我不完全确定您要查找的是什么,但快速反汇编显示a < b < c不是编译成与a < b and b < c相同的字节码的>>> import dis
>>>
>>> def f(a, b, c):
... return a < b < c
...
>>> dis.dis(f)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 0 (
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_FAST 2 (c)
17 COMPARE_OP 0 (
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
>>>
>>> def f(a, b, c):
... return a < b and b < c
...
>>> dis.dis(f)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 COMPARE_OP 0 (
9 JUMP_IF_FALSE_OR_POP 21
12 LOAD_FAST 1 (b)
15 LOAD_FAST 2 (c)
18 COMPARE_OP 0 (
>> 21 RETURN_VALUE
编辑1:进一步挖掘,我认为这是numpy的奇怪之处或错误之处。考虑一下这个示例代码,我认为它可以如您所期望的那样工作。class Object(object):
def __init__(self, values):
self.values = values
def __lt__(self, other):
return [x < other for x in self.values]
def __gt__(self, other):
return [x > other for x in self.values]
x = Object([1, 2, 3])
print x < 5 # [True, True, True]
print x > 5 # [False, False, False]
print 0 < x < 5 # [True, True, True]
编辑2:实际上这并不能“正常”工作。。。print 1 < x # [False, True, True]
print x < 3 # [True, True, False]
print 1 < x < 3 # [True, True, False]
我认为这是在第二次比较1 < x < 3时将布尔值与数字进行比较。
编辑3:我不喜欢从gt、lt、gte、lte特殊方法返回非布尔值的想法,但根据Python文档,它实际上不受限制。By convention, False and True are returned for a successful
comparison. However, these methods can return any value...