In Python, non si crea una variabile aggiuntiva nel tipo di situazione descritta.
for i in range(10):
Crea un oggetto intervallo, su cui il ciclo itera. L'oggetto intervallo mantiene il valore corrente in qualsiasi momento. i
è semplicemente un nome creato e associato a questo valore.
La variabile esiste se ha un nome o meno, poiché l'oggetto intervallo deve conoscere il suo valore corrente.
Se si pensa a un ciclo in termini di istruzioni della CPU, si vede il motivo per cui ci deve essere una variabile:
push x
loop:
do something
increment x
jump if x > y
goto loop
V'è una struttura in alcune lingue JIT compilato che a volte rileva un ciclo di essere solo un piccolo quantità di ripetizioni dello stesso codice e ottimizza il codice per essere una serie delle stesse istruzioni. Ma, per quanto ne so, Python non fa nulla del genere.
Ecco un ciclo for in bytecode:
4 0 SETUP_LOOP 20 (to 23)
3 LOAD_GLOBAL 0 (range)
6 LOAD_FAST 0 (x)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 6 (to 22)
16 STORE_FAST 1 (i)
5 19 JUMP_ABSOLUTE 13
>> 22 POP_BLOCK
Si noti che non c'è paragone. Il ciclo viene chiuso dall'oggetto di iterazione che solleva StopIteration, l'interprete cerca la configurazione del loop e salta alla fine del loop (23 in questo caso).
Ovviamente è possibile evitare tutto ciò semplicemente ripetendo il codice x numero di volte. Non appena questo numero può variare, ci deve essere una sorta di possibilità per fornire next() e StopIteration affinché il ciclo for funzioni.Ricorda, python's for-loop è qualcosa di simile a un ciclo for-each in Java. Non c'è davvero un ciclo tradizionale disponibile a tutti.
Solo a parte: Io uso sempre i, j e k per le variabili iterating. Usare il trattino basso sembra in qualche modo inelegante per me.
fonte
2010-08-30 07:24:43
Perché il 'i' in Java non ti dà fastidio? –
@ S.Lott Non ho detto che il 'i' non mi infastidisce. Mi piace la sintassi Python, come al solito. Ma c'è il fatto che il 'i' in Java sembra essere usato, e io non sono sgridato per non usarlo nel ciclo. –
Il 'i' potrebbe non essere effettivamente utilizzato. Quindi è il "rimprovero"? È questo il problema? –