Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python奇怪的行为:"+=&引用;创建别名_Python_Alias - Fatal编程技术网

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]对于所有
0
n
都是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]]