Questo dipende dall'implementazione e dalla versione di Python e da come vengono utilizzate le "liste di costanti". Sul Cpython2.7.10 con il vostro esempio, sembra che la risposta è che la lista nella condizione della dichiarazione if
viene creato solo una volta ...
>>> def foo():
... for i in iterable:
... if i in [1, 3, 5]:
... print(i)
...
>>> import dis
>>> dis.dis(foo)
2 0 SETUP_LOOP 34 (to 37)
3 LOAD_GLOBAL 0 (iterable)
6 GET_ITER
>> 7 FOR_ITER 26 (to 36)
10 STORE_FAST 0 (i)
3 13 LOAD_FAST 0 (i)
16 LOAD_CONST 4 ((1, 3, 5))
19 COMPARE_OP 6 (in)
22 POP_JUMP_IF_FALSE 7
4 25 LOAD_FAST 0 (i)
28 PRINT_ITEM
29 PRINT_NEWLINE
30 JUMP_ABSOLUTE 7
33 JUMP_ABSOLUTE 7
>> 36 POP_BLOCK
>> 37 LOAD_CONST 0 (None)
40 RETURN_VALUE
Avviso: 16 LOAD_CONST 4 ((1, 3, 5))
ottimizzatore spioncino di Python è trasformato la nostra lista in una tupla (grazie a python!) e la memorizza come una costante. Si noti che l'ottimizzatore di spioncino può eseguire queste trasformazioni sugli oggetti solo se sa che il programmatore non ha assolutamente alcun modo di ottenere un riferimento all'elenco (altrimenti, è possibile modificare l'elenco e modificare il significato del codice). Per quanto ne so, fanno questa ottimizzazione solo per i valori letterali list
, set
che sono composti interamente da costanti e sono l'RHS di un operatore in
. Potrebbero esserci altri casi di cui non sono a conoscenza (dis.dis
è il tuo amico per la ricerca di queste ottimizzazioni).
ho accennato sopra, ma si può fare la stessa cosa con set-letterali nelle versioni più recenti di pitone (in python3.2 +, il set
viene convertito in una costante frozenset
). Il vantaggio è che lo set
/frozenset
ha un test di appartenenza più veloce in media rispetto allo list
/tuple
.
domande come questo sono ciò che 'dis' è fatto per! –
La risposta sembra essere "no". – Jasper