复制变量会改变原变量吗?

83

我有一个简单的Python问题,但非常奇怪。

def estExt(matriz,erro):
    # (1) Determinar o vector X das soluções
    print ("Matrix after:");
    print(matriz);

    aux=matriz;
    x=solucoes(aux); # IF aux is a copy of matrix, why the matrix is changed??

    print ("Matrix before: ");
    print(matriz)

...

正如您在下面看到的那样,矩阵 matriz 在函数 solucoes() 更改的是 aux,但实际上矩阵被更改了。

修改前的矩阵:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

修改后的矩阵:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

3个回答

127

这行代码

aux=matriz;

该方法不会复制matriz,它只是创建了一个名为aux的新引用指向matriz。你可能想要:

aux=matriz[:]

假设matriz是一个简单的数据结构,以下方式将会创建一份副本。如果它更为复杂,你应该考虑使用copy.deepcopy

aux = copy.deepcopy(matriz)

顺便说一句,你不需要在每个语句后面加分号,因为Python不使用它们作为行尾标记。


3
您好,感谢您的回答 =) 但是我有另一个问题,考虑到这个事实:如果b=1且a=b,如果我们改变a=3,在Python中b不会改变。为什么呢?谢谢 =) 您好,这是因为在Python中,a=b的语句只是将b的值赋给了a,而不是将a和b绑定在一起。因此,当您将a的值更改为3时,b的值仍然保持为1,因为它们没有相互依赖的关系。 - André Freitas
8
因为你将变量 a 指向一个不同的对象(整数 3),但是没有改变 b,所以 b 仍然指向 1 - kindall
2
正是我想要的。另外,如果你想要深度复制一个 dict 结构,你可能需要使用 dictionary.copy() - xtonousou

29

使用 copy 模块

aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying

小问题:分号不是必须的。


2
欢迎来到stackoverflow,@AndréFreitas。通常情况下,接受其中一个答案被认为是良好的社区实践(选择你认为最好的答案,不一定是我的)。 - Shekhar

7

aux并非matrix的副本,它只是指向相同对象的不同名称。

使用copy模块创建对象的实际副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接