在for循环Python中更新变量

时间:2015-01-04 10:20:33

标签: python

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

在以下循环中,我通过为每个步骤分配计算的x0来更新x。这很好,但是,我需要计算每个步骤中xx0之间的差异,并将它们保存在名为epsilon的变量中。

由于x0分配在epsilon计算之后的行中,我预计这会有效,但在第一轮循环之后我得到的epsilon是{{1} }原因是0x0在每一步都是相同的。

我一直在考虑这个问题,但我很欣赏一些暗示我做错了什么。

x

2 个答案:

答案 0 :(得分:2)

由于xx0是数组,因此会出错。行x0 = x不会复制数据,而是使xx0都指向相同的数据。在第一次完成后,它们将保持不变。

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

答案 1 :(得分:2)

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

x0 = x[:]
如果它是一个列表并且

将会执行您之后的操作

x0 = x.copy()

如果它是numpy。

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

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

而不是在循环中进行。它会更快,因为numpy已经过优化,可以做到这一点。