嵌套 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())