[PIPython] Stile o non solo stile ?

Lawrence Oluyede l.oluyede
Ven 19 Nov 2004 15:16:52 CET


> "if a is None ..."
> e
> "if a == None..."
> 
> quanto sono equivalenti ?

Da un punto di vista pratico direi che sono identiche, dal punto di
vista del bytecode invece:

In [1]: def f():                                      
   .1.:     a = None
   .1.:     if a is None:
   .1.:         print a
   .1.:         

In [2]: import dis; dis.dis(f)
  2           0 LOAD_GLOBAL              0 (None)
              3 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              9 LOAD_GLOBAL              0 (None)
             12 COMPARE_OP               8 (is)
             15 JUMP_IF_FALSE            9 (to 27)
             18 POP_TOP             

  4          19 LOAD_FAST                0 (a)
             22 PRINT_ITEM          
             23 PRINT_NEWLINE       
             24 JUMP_FORWARD             1 (to 28)
        >>   27 POP_TOP             
        >>   28 LOAD_CONST               0 (None)
             31 RETURN_VALUE        

la seconda opzione risulta in qualcosa di praticamente identico:

In [1]: def g():
   .1.:     a = None
   .1.:     if a == None:
   .1.:         print a
   .1.:         

In [2]: import dis; dis.dis(g)
  2           0 LOAD_GLOBAL              0 (None)
              3 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              9 LOAD_GLOBAL              0 (None)
             12 COMPARE_OP               2 (==)
             15 JUMP_IF_FALSE            9 (to 27)
             18 POP_TOP             

  4          19 LOAD_FAST                0 (a)
             22 PRINT_ITEM          
             23 PRINT_NEWLINE       
             24 JUMP_FORWARD             1 (to 28)
        >>   27 POP_TOP             
        >>   28 LOAD_CONST               0 (None)
             31 RETURN_VALUE        

mentre, come sono abituato io uso l'operatore not in questi casi
facendo in questo modo: "if not a:" difatti il byte code risultante è
leggermente diverso perchè non si fa il load del None ma si limita a
fare il not unario sul contenuto di a, vedi:

In [3]: def h():
   .3.:     a = None
   .3.:     if not a:
   .3.:         print a
   .3.:         

In [4]: dis.dis(h)
  2           0 LOAD_GLOBAL              0 (None)
              3 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              9 UNARY_NOT           
             10 JUMP_IF_FALSE            9 (to 22)
             13 POP_TOP             

  4          14 LOAD_FAST                0 (a)
             17 PRINT_ITEM          
             18 PRINT_NEWLINE       
             19 JUMP_FORWARD             1 (to 23)
        >>   22 POP_TOP             
        >>   23 LOAD_CONST               0 (None)
             26 RETURN_VALUE        


In pratica... nessuna delle due opzioni che hai presentato, meglio la terza :P

-- 
Lawrence
"If the implementation is hard to explain, it's a bad idea."
from The Zen of Python by Tim Peters



More information about the Python mailing list