单行python语句中“==”和“in”的奇怪行为
单行python语句中“==”和“in”的奇怪行为,python,python-2.7,logical-operators,Python,Python 2.7,Logical Operators,从反汇编代码中,我可以看到foo1()应该返回False,因为它不会执行比较中的,因此False 但是foo2()发生了什么,为什么返回False 而foo3()和foo4()工作得非常完美,我们可以从反汇编代码中确认这一点 参考: 蟒蛇2.7 我见过类似的行为python3+;反汇编代码不同,但反汇编代码中的逻辑似乎相同 Python运算符优先级: 中的==和的运算符优先级相同,但不符合预期。中的和==都是关系运算符,也是Python链中的关系运算符3同时执行[1,2,3]中的3和[1,2,
从反汇编代码中,我可以看到
foo1()
应该返回False
,因为它不会执行比较中的,因此False
但是foo2()发生了什么,为什么返回False
而foo3()和foo4()工作得非常完美,我们可以从反汇编代码中确认这一点
参考:
蟒蛇2.7
我见过类似的行为python3+;反汇编代码不同,但反汇编代码中的逻辑似乎相同
Python运算符优先级:
中的==
和的运算符优先级相同,但不符合预期。中的和==
都是关系运算符,也是Python链中的关系运算符<[1,2,3]==True
中的code>3同时执行[1,2,3]
中的3和[1,2,3]==True
但无论如何,你不应该和布尔人比较。如果需要,将结果传递给bool()
,但是中的已经生成布尔值。中的和==
都是关系运算符,也是Python链中的关系运算符<[1,2,3]==True
中的code>3同时执行[1,2,3]
中的3和[1,2,3]==True
但无论如何,你不应该和布尔人比较。如果需要,将结果传递到bool()
,但是中的已经生成了布尔值。哦!太傻了,错过了:(以防万一)这里是指向文档的链接:哦!太傻了,错过了:(以防万一)这里是指向文档的链接:
def foo1():
return True == 3 in [1,2,3]
def foo2():
return 3 in [1,2,3] == True
def foo3():
return True == ( 3 in [1,2,3] )
def foo4():
return ( 3 in [1,2,3] ) == True
foo1() => False
foo2() => False
foo3() => True
foo4() => True
import dis
dis.dis(foo1)
2 0 LOAD_CONST 1 (True)
2 LOAD_CONST 2 (3)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 2 (==)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_CONST 5 ((1, 2, 3))
14 COMPARE_OP 6 (in)
16 RETURN_VALUE
>> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE
dis.dis( foo2 )
2 0 LOAD_CONST 1 (3)
2 LOAD_CONST 2 (1)
4 LOAD_CONST 3 (2)
6 LOAD_CONST 1 (3)
8 BUILD_LIST 3
10 DUP_TOP
12 ROT_THREE
14 COMPARE_OP 6 (in)
16 JUMP_IF_FALSE_OR_POP 24
18 LOAD_CONST 4 (True)
20 COMPARE_OP 2 (==)
22 RETURN_VALUE
>> 24 ROT_TWO
26 POP_TOP
28 RETURN_VALUE
>>> dis.dis( foo3 )
2 0 LOAD_CONST 1 (True)
2 LOAD_CONST 2 (3)
4 LOAD_CONST 5 ((1, 2, 3))
6 COMPARE_OP 6 (in)
8 COMPARE_OP 2 (==)
10 RETURN_VALUE
>>> dis.dis( foo4 )
2 0 LOAD_CONST 1 (3)
2 LOAD_CONST 5 ((1, 2, 3))
4 COMPARE_OP 6 (in)
6 LOAD_CONST 4 (True)
8 COMPARE_OP 2 (==)
10 RETURN_VALUE