2010-02-09 103 views
1

根据python文档,x<y<z比较被翻译为x<y and y<z,并且表达式y最多只评估一次。
现在我的问题是,表达式y(看下面的代码)在这里只评估一次吗?Python比较评估

if(x<y and y<z): 
+0

是什么让你认为Python将优化呢?你有报价或参考指出它优化? – 2010-02-09 18:14:28

+0

难道你不能...试试看,找出来? – 2010-02-10 01:56:11

回答

9

两次:

>>> def f(): 
... print "F called" 
... return 1 
... 
>>> 0 < f() < 100 
F called 
True 
>>> 0 < f() and f() < 100 
F called 
F called 
True 
>>> if (0 < f() and f() < 100): 
... print True 
... 
F called 
F called 
True 
>>> 
3

号:

>>> dis.dis(lambda x, y, z: x < y() < z) 
    1   0 LOAD_FAST    0 (x) 
       3 LOAD_FAST    1 (y) 
       6 CALL_FUNCTION   0 
       9 DUP_TOP    
      10 ROT_THREE   
      11 COMPARE_OP    0 (<) 
      14 JUMP_IF_FALSE   8 (to 25) 
      17 POP_TOP    
      18 LOAD_FAST    2 (z) 
      21 COMPARE_OP    0 (<) 
      24 RETURN_VALUE   
     >> 25 ROT_TWO    
      26 POP_TOP    
      27 RETURN_VALUE   
>>> dis.dis(lambda x, y, z: x < y() and y() < z) 
    1   0 LOAD_FAST    0 (x) 
       3 LOAD_FAST    1 (y) 
       6 CALL_FUNCTION   0 
       9 COMPARE_OP    0 (<) 
      12 JUMP_IF_FALSE   13 (to 28) 
      15 POP_TOP    
      16 LOAD_FAST    1 (y) 
      19 CALL_FUNCTION   0 
      22 LOAD_FAST    2 (z) 
      25 COMPARE_OP    0 (<) 
     >> 28 RETURN_VALUE