【问题标题】:nested for loops, all iterations are identical [duplicate]嵌套for循环,所有迭代都是相同的[重复]
【发布时间】:2020-11-19 20:21:31
【问题描述】:

我是 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)。甚至Vini也改变了它的价值!这是一种浅/深复制的东西,还是别的什么?我该如何解决这个问题,我该如何推理这种事情? (来自其他语言,其中 a=b 表示深拷贝)。

【问题讨论】:

  • 你一直在对同一个列表附加一个引用:V
  • “我的问题是 Vlist 的所有元素都是相同的”因为您在每次迭代中都不断附加相同的 numpy.ndarray 对象Vlist.append(V) 当然,@987654325 @ 只是一遍又一遍地包含相同的对象。这与浅拷贝和深拷贝无关,这与复制与不复制有关。要获取不同的对象,请使用Vlist.append(V.copy())

标签: python numpy deep-copy


【解决方案1】:

请注意,Python 中保存对象的变量类似于 指向实际对象的“指针”(在其他语言中)。

您的意图是将V当前内容保存在Vlist中, 所以每次你向 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多