Python, ¿por qué i = + 1 no produce un bucle infinito?

Así que el otro día me encontré con un problema debido a un error tipográfico. En lugar de iterar a través de mi bucle nested con i + = 1, estaba usando i = + 1. No noté esto hasta que comencé a imprimir la cantidad de pasos y vi que estaba imprimiendo el paso 1 continuamente. Las ttwigs que estaba obteniendo, por lo tanto, no tenían ningún sentido.

Sin embargo, lo que no entiendo es por qué obtuve gráficos, ¿y el código no se atascó en un bucle infinito? Además, solo debería haber estado calculando datos después de la mitad de la cantidad de pasos, por lo que no entiendo cómo tenía ningún dato. ¿O es que i = + 1 significa algo más? Parece que no puedo encontrar mucha información en i = + 1 en línea

Aquí hay una versión condensada del código original:

for temp in np.linspace(1.0,4.0,num=100): energyarray = [] for step in np.arange(0, sw*2): for i in range(n-1): for j in range(n-1): H_old = -J*matrix[i,j]*(matrix[i,j-1] + matrix[i,j+1] + matrix[i-1,j] + matrix[i+1,j]) H_new = J*matrix[i,j]*(matrix[i,j-1] + matrix[i,j+1] + matrix[i-1,j] + matrix[i+1,j]) del_H = H_old-H_new if del_H >= 0: matrix[i,j] = -matrix[i,j] elif del_H < 0: prob = np.exp((del_H)/(temp)) rand = random.random() if rand = (sw): Ene = EnergyCal(matrix) energyarray.append(Ene) step =+ 1 energy_sum = [] energy_sum = sum(energyarray) plt.figure(10) plt.plot(temp, energy_sum, 'ro') plt.show() 

Los bucles for de Python son bucles “para-cada” basados ​​en iteradores. La variable de iteración se reasigna al comienzo de cada iteración. En otras palabras, el siguiente bucle:

 In [15]: nums = 1,2,5,8 In [16]: for num in nums: ...: print(num) ...: 1 2 5 8 

Es equivalente a:

 In [17]: it = iter(nums) ...: while True: ...: try: ...: num = next(it) ...: except StopIteration: ...: break ...: print(num) ...: 1 2 5 8 

Del mismo modo, los siguientes bucles son equivalentes:

 In [19]: for num in nums: ...: print("num:", num) ...: num += 1 ...: print("num + 1:", num) ...: ...: num: 1 num + 1: 2 num: 2 num + 1: 3 num: 5 num + 1: 6 num: 8 num + 1: 9 In [20]: it = iter(nums) ...: while True: ...: try: ...: num = next(it) ...: except StopIteration: ...: break ...: print("num:", num) ...: num += 1 ...: print("num + 1:", num) ...: num: 1 num + 1: 2 num: 2 num + 1: 3 num: 5 num + 1: 6 num: 8 num + 1: 9 

Tenga en cuenta que los bucles for de estilo C no existen en Python, pero siempre puede escribir un bucle while (el estilo c para bucles es esencialmente azúcar sintáctico para bucles while):

 for(int i = 0; i < n; i++){ // do stuff } 

Es equivalente a:

 i = 0 while i < n: # do stuff i += 1 

Tenga en cuenta que la diferencia es que, en este caso, la iteración depende de i , cualquier cosa en # do stuff que modifique impactará en la iteración, mientras que en el caso anterior, la iteración depende del iterador . Tenga en cuenta que si modificamos el iterador, la iteración se ve afectada:

 In [25]: it = iter(nums) # give us an iterator ...: for num in it: ...: print(num) ...: junk = next(it) # modifying the iterator by taking next value ...: ...: 1 5 

step se sobrescribe en cada iteración según el original for :

 for step in np.arange(0, sw*2): step = 1 # doesn't matter, it'll get reset on next iteration