Python, por que eu = + 1 não resulta em um loop infinito?

Então no outro dia eu estava preso em um problema por causa de um erro de digitação. Em vez de percorrer o loop nested com i + = 1, usei i = + 1. Eu não percebi isso até que comecei a imprimir o número de etapas e vi que estava imprimindo a etapa 1 continuamente. As plots que eu estava recebendo, portanto, não faziam sentido.

No entanto, o que eu não entendo é por que eu tenho algum plano, e o código não estava preso em um loop infinito? Além disso, eu só deveria ter calculado dados após metade do número de etapas, então não entendo como eu tinha dados. Ou eu = + 1 significa outra coisa? Eu não consigo encontrar muita informação sobre i = + 1 em todos os on-line

Aqui está uma versão condensada do 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() 

Python for-loops são loops “for-each” baseados em iteradores. A variável de iteração é reatribuída no início de cada iteração. Em outras palavras, o seguinte loop:

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

É equivalente a:

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

Da mesma forma, os loops a seguir são 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 

Note, os loops para o estilo C não existem em Python, mas você sempre pode escrever um loop while (loops c-style são essencialmente açúcar sintático para while-loops):

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

É equivalente a:

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

Note que a diferença é que, neste caso, a iteração depende de i , qualquer coisa em # do stuff que modifiquem a influência da iteração, enquanto no caso anterior, a iteração depende do iterador . Observe que, se modificarmos o iterador, a iteração será afetada:

 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 é sobrescrita em cada iteração com base no original for :

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