您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中的链式比较实际上如何工作?

Python中的链式比较实际上如何工作?

您可以简单地让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,FalseJUMP_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_*值再次清除。

然后,堆栈保存 未命名的中间结果 以进行比较

python 2022/1/1 18:38:52 有449人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶