Python: 不能给元素赋值,当它是reduce函数的输出时

Python: cannot assign value to element, when it is the output of reduce function

我无法理解为什么我正在处理的 python2 程序有问题。

以下运行正常:

from functools import reduce

C=[[[0],[1]],[[2],[3]]]

print C[0][0], C[0][1]
print C[1][0], C[1][1]

print "Element with indices 1,1:", reduce(lambda l, i: l[i], [1,1], C)

reduce(lambda l, i: l[i], [1,1], C).append(4)
print C[0][0], C[0][1]
print C[1][0], C[1][1]

它输出:

[0] [1]
[2] [3]
Element with indices 1,1: [3]
[0] [1]
[2] [3, 4]

但是,如果我添加以下行:

reduce(lambda l, i: l[i], [1,1], C)=[4]    

我收到错误:

    reduce(lambda l, i: l[i], [1,1], C)=[4]
SyntaxError: can't assign to function call

我在这里有点困惑。在第一种情况下,我能够使用 append 更改 reduce(lambda l, i: l[i], [1,1], C) 指向的列表元素。但在第二种情况下,我不能改变它的价值。我觉得我在这里缺少一些基本的东西。有人可以解释一下这两种情况有什么区别吗?

分配不会修改预先存在的值。它采用新值并将其分配给目标。例如:

x = y = [1]
x = [2]       #doesn't change y

因此,您不能对函数调用的结果进行赋值:这样做没有意义,因为没有任何东西可以重新赋值。

要更改列表的内容而不重新分配它,请使用 x[:] = [2]。这就是切片赋值,它与普通赋值的不同之处在于它修改了列表的内容,而不是对列表本身重新赋值。在上面的示例中,这将同时修改 xy,因为它们仍然引用相同的列表。

在您的代码中,您需要:

reduce(lambda l, i: l[i], [1,1], C)[:] = [4]
                                   ^^^

修改reduce返回的列表:

>>> C=[[[0],[1]],[[2],[3]]]
>>> reduce(lambda l, i: l[i], [1,1], C)[:] = [4]
>>> C
[[[0], [1]], [[2], [4]]]