2015-04-23 5 views
5

Si consideri il seguente frammento di codice Python:Python for loop: perché questo ciclo non è infinito?

x = 14 
for k in range(x): 
    x += 1 

Al termine dell'esecuzione, x è pari a 28.

La mia domanda: non dovrebbe questo codice ciclo per sempre? Ad ogni iterazione, controlla se k è inferiore a x. Tuttavia, x viene incrementato all'interno del ciclo for, quindi ha un valore superiore per il confronto successivo.

+0

Quale versione di Python stai usando? – thefourtheye

risposta

9

range(x) non è un "comando". Crea un oggetto intervallo una volta e il ciclo scorre su quello. Cambiare x non cambia tutti gli oggetti che sono stati creati usandolo.

>>> x = 2 
>>> k = range(x) 
>>> list(k) 
[0, 1] 
>>> x += 1 
>>> list(k) 
[0, 1] 
6

no, range(x) restituirà un elenco con gli articoli [0,1,2,3,4,5,6,7,8,9,10,11,12,13] questi elementi saranno iterato. Ogni volta che il corpo del loop viene valutato, il valore cambia di x, ma ciò non influisce sull'elenco che era già stato generato.

in altre parole, la raccolta che verrà iterata verrà generata una sola volta.

+2

Per essere pedante, restituisce una lista in Python 2 e un oggetto 'range' in Python 3. – Blair

1

È perché pitone for in anello hanno un comportamento diverso rispetto al for (in altre lingue): range(x) non viene eseguito in ogni iterazione, ma a prima volta, e poi for in iterare tutti i suoi elementi. Se si desidera modificare il codice per eseguire un ciclo infinito, è possibile utilizzare invece un while (e in tal caso l'intervallo (x) non ha senso).

0

Il for loop in python non è un iteratore, ma piuttosto scorre su una sequenza/generatore, ad esempio qualsiasi forma di iterable.

Considerando ciò, a meno che l'iterabile non sia infinito, il ciclo non sarà infinito. A sequence non può essere infinito ma è possibile creare/utilizzare un generatore infinito. Una possibilità è quella di utilizzare itertools.count che genera una sequenza senza fine di numeri che iniziano da un inizio specificato con un intervallo specificato.

from itertools import count  | for(;;) { 
for i in count(0):     |  //An infinite block 
    #An infinite block    | } 

In alternativa, si può sempre utilizzare ciclo while per creare un ciclo infinito classica

while True: 
    #An infinite block