【问题标题】:Python, why does i=+1 not result in an infinite loop? [duplicate]Python,为什么 i=+1 不会导致无限循环? [复制]
【发布时间】:2018-06-25 16:40:51
【问题描述】:

所以前几天我因为一个错字而被困在一个问题上。我没有使用 i += 1 遍历我的嵌套循环,而是使用 i=+1。直到我开始打印步数并看到它连续打印第 1 步时,我才注意到这一点。因此,我得到的情节没有任何意义。

但是我不明白为什么我有任何情节,并且代码没有陷入无限循环?另外,我应该只在步数进行到一半之后才计算数据,所以我根本不明白我是如何获得任何数据的。还是 i =+ 1 意味着别的?我似乎在网上根本找不到关于 i=+1 的太多信息

这是原始代码的精简版:

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 < prob:
                        matrix[i,j] = -matrix[i,j]
                    else:
                        matrix[i,j] = matrix[i,j]  

        if step >= (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()

【问题讨论】:

  • 因为它不是while 循环?并且递增/递减对下一次迭代没有影响......
  • @WillemVanOnsem 很高兴知道感谢您的帮助
  • 有关for 循环的更多详细信息,请参见here

标签: python python-2.7 numpy matplotlib


【解决方案1】:

step 在每次迭代时都会根据原始for 被覆盖:

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

【讨论】:

  • 对,这是有道理的。谢谢
【解决方案2】:

Python for 循环是基于迭代器的“for-each”循环。迭代变量在每次迭代开始时重新分配。也就是说,下面的循环:

In [15]: nums = 1,2,5,8

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

相当于:

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

同样,以下循环是等价的:

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

注意,C 风格的 for 循环在 Python 中不存在,但您始终可以编写一个 while 循环(c 风格的 for 循环本质上是 while 循环的语法糖):

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

相当于:

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

注意,不同之处在于,在这种情况下,迭代取决于i# do stuff 中修改i 的任何内容都会影响迭代,而在前一种情况下,迭代取决于迭代器。注意,如果我们修改了迭代器,那么迭代就会受到影响:

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

【讨论】:

  • 请注意,同样的问题在几分钟前被提出并关闭为重复。
  • @Jean-FrançoisFabre 啊,天哪,没看到。
  • 几秒钟前我刚刚关闭。别担心,我不会尝试对问答进行核对。并不是所有的重复都是邪恶的。
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多