Python奇怪的行为:"+=&引用;创建别名
我无法解释此代码的行为:Python奇怪的行为:"+=&引用;创建别名,python,alias,Python,Alias,我无法解释此代码的行为: n=[[0,0],[0,0]] m=n.copy() for i in range(len(m)): m[i]+=[0] 我得到的输出是(不是我期望的): 如果我改为键入: n=[[0,0],[0,0]] m=n.copy() for i in range(len(m)): m[i]=m[i]+[0] 我得到了正确的输出(这是我最初期望的): 所以,如果我使用“+=”快捷键,两个矩阵“m”和“n”就会变成别名。有人能解释一下为什么会这样吗 n.c
n=[[0,0],[0,0]]
m=n.copy()
for i in range(len(m)):
m[i]+=[0]
我得到的输出是(不是我期望的):
如果我改为键入:
n=[[0,0],[0,0]]
m=n.copy()
for i in range(len(m)):
m[i]=m[i]+[0]
我得到了正确的输出(这是我最初期望的):
所以,如果我使用“+=”快捷键,两个矩阵“m”和“n”就会变成别名。有人能解释一下为什么会这样吗 n.copy()
创建一个浅拷贝,因此n[i]
和m[i]
已经指向同一对象(尽管m
和n
不同)
对于列表,x+=y
与x=x+y
并不完全相同-前者直接变异x
(相当于x.extend(y)
),而后者将x
赋值给一个新值
这两个事实结合起来解释了这种行为。这里的区别在于
some\u list+=some\u iterable
实际上与some\u list.extend(some\u iterable)
是一样的
some\u list=some\u list+[something\u other]
实际上是将some\u list
和[something\u other]
连接在一起创建一个新列表,然后将该新列表分配回=
操作符的左侧
如果您这样想,并且知道在复制之后,m[idx]对于所有0n都是n[idx]
。copy()
不是深度复制,m
和n
都包含相同的列表实例:
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]]