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]
。这就是切片赋值,它与普通赋值的不同之处在于它修改了列表的内容,而不是对列表本身重新赋值。在上面的示例中,这将同时修改 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]]]
我无法理解为什么我正在处理的 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]
。这就是切片赋值,它与普通赋值的不同之处在于它修改了列表的内容,而不是对列表本身重新赋值。在上面的示例中,这将同时修改 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]]]