2010-02-09 7 views
1

Conformément à la documentation python, la comparaison x<y<z est traduite en x<y and y<z et l'expression y est évaluée une seule fois au maximum.
Maintenant, ma question est, est-ce qu'une expression y (regardez le code ci-dessous) est évaluée une seule fois ici?Évaluation de comparaison Python

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

Qu'est-ce que vous fait penser Python optimiserait cela? Avez-vous un devis ou une référence qui indique qu'il optimise? –

+0

Tu ne peux pas juste ... essayer et savoir? –

Répondre

9

deux fois:

>>> 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

No:

>>> 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