在查看另一个问题时,新的提问者使用了以下形式的表达式:
foo in bar == baz
我开始解释Python如何解释该表达式,但很快意识到我实际上并不知道Python如何解释该表达式。懒得查看操作顺序,我认为它必须等同于:
(foo in bar) == baz
或者:
foo in (bar == baz)
我从一些测试中发现,这些都不是真的。进一步挖掘,两个带括号的语句的字节码非常简单:
>>> dis(lambda foo, bar, baz:(foo in bar) == baz)
1 0 LOAD_FAST 0 (foo)
3 LOAD_FAST 1 (bar)
6 COMPARE_OP 6 (in)
9 LOAD_FAST 2 (baz)
12 COMPARE_OP 2 (==)
15 RETURN_VALUE
>>> dis(lambda foo, bar, baz:foo in (bar == baz))
1 0 LOAD_FAST 0 (foo)
3 LOAD_FAST 1 (bar)
6 LOAD_FAST 2 (baz)
9 COMPARE_OP 2 (==)
12 COMPARE_OP 6 (in)
15 RETURN_VALUE
但是,朴实的版本的字节码更有趣:
>>> dis(lambda foo, bar, baz:foo in bar == baz)
1 0 LOAD_FAST 0 (foo)
3 LOAD_FAST 1 (bar)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 6 (in)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_FAST 2 (baz)
17 COMPARE_OP 2 (==)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
从我对字节码的基本把握,这看起来相当于:
if foo in bar:
return bar == baz
else:
return False
我完全不知道这种结构的目的是什么。我偶然发现了一些深奥的速记吗?这是其他一些语法的副作用吗?