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

时间:2015-04-08 16:12:52

标签: python list python-2.7 reduce

我无法理解为什么我正在处理的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

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

1 个答案:

答案 0 :(得分:2)

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

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