嵌套 for 循环,所有迭代都是相同的
nested for loops, all iterations are identical
我是 Python 的新手,以下玩具问题让我很困惑:
import numpy as np
V = np.ones([3,3])
Vini = V
Niter = 10
Vlist = list() # collect all iterations
Vlist.append(V)
for it in range(1, Niter-1):
for ix in range(0,3):
for iy in range(0,3):
V[iy,ix] = Vlist[it-1][iy,ix] + 1
Vlist.append(V) # save current iteration
(请注意,我不是在追求效率提升——这纯粹是为了说教)
我的问题是 Vlist 的所有元素都是相同的,我希望它们在每次迭代时都不同(相差 1)。甚至维尼也改变了它的价值!这是 shallow/deep 复制之类的东西,还是其他东西?我该如何解决这个问题,我该如何推理这种事情? (来自其他语言,其中 a=b 表示深度复制)。
请注意,在 Python 中保存对象的变量类似于
指向实际对象的“指针”(在其他语言中)。
您的目的是在 Vlist 中保存 V 的 当前内容,
所以每次你追加一些东西到 Vlist,你应该追加
相关对象的 副本。
因此将您的代码更改为:
Vlist.append(V.copy())
for it in range(1, Niter-1):
for ix in range(0,3):
for iy in range(0,3):
V[iy,ix] = Vlist[it-1][iy,ix] + 1
Vlist.append(V.copy())
顺便说一句:您可以生成相同的结果 运行:
Vlist.append(V.copy())
for it in range(1, Niter-1):
V += 1
Vlist.append(V.copy())
我是 Python 的新手,以下玩具问题让我很困惑:
import numpy as np
V = np.ones([3,3])
Vini = V
Niter = 10
Vlist = list() # collect all iterations
Vlist.append(V)
for it in range(1, Niter-1):
for ix in range(0,3):
for iy in range(0,3):
V[iy,ix] = Vlist[it-1][iy,ix] + 1
Vlist.append(V) # save current iteration
(请注意,我不是在追求效率提升——这纯粹是为了说教)
我的问题是 Vlist 的所有元素都是相同的,我希望它们在每次迭代时都不同(相差 1)。甚至维尼也改变了它的价值!这是 shallow/deep 复制之类的东西,还是其他东西?我该如何解决这个问题,我该如何推理这种事情? (来自其他语言,其中 a=b 表示深度复制)。
请注意,在 Python 中保存对象的变量类似于 指向实际对象的“指针”(在其他语言中)。
您的目的是在 Vlist 中保存 V 的 当前内容, 所以每次你追加一些东西到 Vlist,你应该追加 相关对象的 副本。
因此将您的代码更改为:
Vlist.append(V.copy())
for it in range(1, Niter-1):
for ix in range(0,3):
for iy in range(0,3):
V[iy,ix] = Vlist[it-1][iy,ix] + 1
Vlist.append(V.copy())
顺便说一句:您可以生成相同的结果 运行:
Vlist.append(V.copy())
for it in range(1, Niter-1):
V += 1
Vlist.append(V.copy())