我无法解释此代码的行为:
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"成为别名。有人可以解释为什么会这样吗?
答案 0 :(得分:2)
n.copy()
会创建一个浅表副本,因此n[i]
和m[i]
已指向同一个对象(尽管m
和n
不同)。< / 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
生成浅副本 - 这意味着它只复制引用。