发电机总是返回相同的元素



我的代码读取为:

def xgauss(self):
    m, n = self.m, self.n
    M = self.copy()
    for k in range(n):
        for i in range(k + 1, m):
            yield M
            if not likezero(M[i][k]):
                lam = M[i][k] / M[k][k]
                M[i] = M[i] - lam * M[k]
    yield M

目前足以说,如果值少于精度(用于数值比较(; - (

我的目标是返回高斯消除算法的每种迭代,以进行研究(教室(。

我有一些测试输入为:

In [77]: A
Out[77]: 
Matrix([
        [     1,      4,      1],
        [     1,      6,     -1],
        [     2,     -1,      2]
      ])
In [78]: Ab
Out[78]: 
Matrix([
        [      1,       4,       1,       7],
        [      1,       6,      -1,      13],
        [      2,      -1,       2,       5]
      ])

奇怪,当我通过矩阵AB打电话给发电机时

In [76]: list(Ab.xgauss())
Out[76]: 
[Matrix([
         [      1,       4,       1,       7],
         [      0,       2,      -2,       6],
         [      0,       0,      -9,      18]
       ]), Matrix([
         [      1,       4,       1,       7],
         [      0,       2,      -2,       6],
         [      0,       0,      -9,      18]
       ]), Matrix([
         [      1,       4,       1,       7],
         [      0,       2,      -2,       6],
         [      0,       0,      -9,      18]
       ]), Matrix([
         [      1,       4,       1,       7],
         [      0,       2,      -2,       6],
         [      0,       0,      -9,      18]
       ])]

这是正确的答案(应该只是最后一次迭代(,但是我看不到每个步骤,生成器在所有迭代中返回矩阵结果。我不知道会发生什么。

在您的发电机中,您有一个值m,这是您的类的实例。您每次都会产生相同的对象。在每次迭代中,您都在修改对象。发电机不产生M的副本,它会引起对M的引用,与函数未返回副本相同,它们返回参考。

当您列出生成器的结果列表时,您正在列出一个对同一对象的引用。打印列表多次显示相同的对象,显示其最后一个状态。

顺便说一句,Python的这种行为(没有隐式副本,很多参考(在我的PYCON谈话中更详细地介绍:Python名称和价值。

相关内容

  • 没有找到相关文章

最新更新