Python奇怪的行为:" + ="创建别名

时间:2016-06-09 23:14:13

标签: python alias

我无法解释此代码的行为:

n=[[0,0],[0,0]]
m=n.copy()
for i in range(len(m)):
     m[i]+=[0]

我得到的输出(不是我的预期):

>>> m
[[0, 0, 0], [0, 0, 0]]
>>> n
[[0, 0, 0], [0, 0, 0]]

如果我改为输入:

n=[[0,0],[0,0]]
m=n.copy()
for i in range(len(m)):
     m[i]=m[i]+[0]

我得到了正确的输出(这是我最初的预期):

>>> m
[[0, 0, 0], [0, 0, 0]]
>>> n
[[0, 0], [0, 0]]

所以,如果我使用" + ="快捷两个矩阵" m"和" n"成为别名。有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

n.copy()会创建一个浅表副本,因此n[i]m[i]已指向同一个对象(尽管mn不同)。< / p>

对于列表,x += y x = x + y完全不同 - 前者直接改变x(它相当于x.extend(y))而后者则将x分配给新值。

这两个事实结合起来解释了这种行为。

答案 1 :(得分:1)

这里的区别在于some_list += some_iterable实际上与some_list.extend(some_iterable)相同。

some_list = some_list + [something_else]实际创建了some_list[something_else]连接在一起的新列表,然后将新列表分配回=运算符的左侧。< / p>

当你以这种方式思考时,并且知道复制后,m[idx] is n[idx]对所有0 <= idx < len(m) 1 ,更容易理解为什么{{1} }版本更改同时显示在+=m

1 n生成副本 - 这意味着它只复制引用。