在 for 循环中更新变量 Python

Updating a variable in a for loop Python

我正在研究幂法的实现,以计算给定矩阵的主特征向量和特征值。我没有发布完整的代码,我有一个我无法理解的具体问题。

在下面的循环中,我通过将每个步骤的计算 x 分配给它来更新 x0。这工作正常,但是,我需要计算每个步骤中 xx0 之间的差异,并将它们保存在名为 epsilon.

的变量中

由于 x0 赋值在 epsilon 计算后出现在行中,我希望它能工作,但在第一轮循环后我得到的 epsilon0,原因是 x0x 在每个步骤中都是相同的。

我一直在考虑这个问题,但我希望能得到一些提示,指出我做错了什么。

for k in range(10):
    y = matprod.matvec(m, x0)
    normy = normvec.normvec(y)
    for i in range(len(y)):
        x[i] = y[i] / normy
        epsilon[i] = x[i] - x0[i]
    x0 = x
    print k, x, x0, normy, epsilon

由于xx0是数组,所以报错。 x0 = x 行不复制数据,而是使 xx0 指向相同的数据。第一次完成后,他们将保持不变。

如果您想将数据从 x 复制到 x0,您应该使用 x0 = x[:]。 slice 语法 ([:]) 创建数据的副本,因此应该可以工作。

这是 Python 中常见错误之一的结果。当我们有一个列表 b 并设置 a=b 时,我们并没有将 a 的每个值都设置为等于 b 的每个值。相反,我们将它们设置为 相同的东西 它们在内存中的位置相同。对其中一个的任何改变都会改变另一个。任何时候你有两个似乎总是相同的列表(或任何 python 对象),或者一个对象似乎在你意想不到的时候发生变化,你应该始终检查你是否已经这样做了。

x0 = x[:]

如果它是一个列表并且

将执行您想要的操作
x0 = x.copy()

如果它是麻木的。

假设这些是 numpy 数组,您还可以通过设置

来改进您的代码
x = y/normy
epsilon = x-x0

而不是循环执行。它会快得多,因为 numpy 已针对此进行了优化。