您可以简单地让Python告诉您dis
模块产生了什么字节码:
>>> import dis
>>> def f(): return 1 < input("Value:") < 10
...
>>> dis.dis(f)
1 0 LOAD_CONST 1 (1)
3 LOAD_GLOBAL 0 (input)
6 LOAD_CONST 2 ('Value:')
9 CALL_FUNCTION 1
12 DUP_TOP
13 ROT_THREE
14 COMPARE_OP 0 (<)
17 JUMP_IF_FALSE_OR_POP 27
20 LOAD_CONST 3 (10)
23 COMPARE_OP 0 (<)
26 RETURN_VALUE
>> 27 ROT_TWO
28 POP_TOP
29 RETURN_VALUE
Python使用堆栈;该CALL_FUNCTION
字节码堆(上用途项目input
的全球和'Value:'
字符串)调用函数用一个参数,更换堆栈函数调用的结果在这两个项目。在函数调用之前,常量1
已加载到堆栈中。
因此,在input
被调用时,堆栈看起来像:
input_result
1
并DUP_TOP
复制最高值,然后旋转最高的三个堆栈值以得出:
1
input_result
input_result
和COMPARE_OP
用来测试前两项<
,并用结果替换前两项。
如果结果是字节码跳转到27,False
则JUMP_IF_FALSE_OR_POP
字节码将False
顶部的剩余部分旋转到顶部,input_result
用a清除该字节POP_TOP
,然后返回剩余的False
顶部值作为结果。
True
但是,如果结果是该值,则该JUMP_IF_FALSE_OR_POP
字节码会从堆栈中弹出该值,并将其放置10
在顶部,我们得到:
10
input_result
然后进行另一个比较并返回。
综上所述,基本上,Python会这样做:
stack_1 = stack_2 = input('Value:')
if 1 < stack_1:
result = False
else:
result = stack_2 < 10
与stack_*
值再次清除。
然后,堆栈保存 未命名的中间结果 以进行比较