我无法理解为什么我正在处理的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)
指向的列表元素。但在第二种情况下,我无法改变它的价值。我觉得我在这里缺少一些基本的东西。有人可以解释这两种情况之间有什么区别吗?
答案 0 :(得分:2)
分配不会修改预先存在的值。它需要一个新值并将其分配给目标。例如:
x = y = [1]
x = [2] #doesn't change y
由于这个原因,你无法分配到函数调用的结果中:这样做是没有意义的,因为没有任何东西可以重新分配。
要更改列表内容而不重新分配,请使用x[:] = [2]
。这是切片分配,它与正常分配不同,因为它修改了列表的内容而不重新分配列表本身。在上面的示例中,这会修改x
和y
,因为它们仍然引用相同的列表。
在您的代码中,您需要:
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]]]