生成器始终返回相同的元素

时间:2017-04-23 18:00:31

标签: python generator linear-algebra

我的代码如下:

while (results.hasNext()) {
    QuerySolution querySolution = results.next();
    RDFNode node = querySolution.get("n");
    String name = node.asLiteral().getString();
    System.out.println(name);
}

现在足以说ifzero如果值小于精度则返回true(对于数值比较); - )

我的目标是返回高斯消除算法的每次迭代以供学习(课堂)。

我有一些测试输入:

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

奇怪与否,当我通过Matrix Ab调用生成器时(通过A我也得到相同的行为),我得到了:

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]
      ])

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

1 个答案:

答案 0 :(得分:6)

在您的生成器中,您有一个值M,它是您的类的一个实例。每次都会生成相同的对象。在每次迭代中,您都在修改对象。生成器不会产生M的副本,它产生对M的引用,与函数不返回副本的方式相同,它们返回引用。

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

顺便说一下,我的PyCon演讲中详细介绍了Python的这种行为(没有隐式副本,很多引用):Python Names and Values