[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