副本变量更改原始?

我在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)

...

如下所示,尽管aux是被函数solucoes()所更改的矩阵,但矩阵[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]仍被更改。

之前的矩阵:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

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

André Freitas asked 2020-06-29T19:44:16Z
3个解决方案
67 votes

线

aux=matriz;

没有复制copy.deepcopy,它只是创建了对matriz的新引用,名为aux。您可能想要

aux=matriz[:]

假设copy.deepcopy是一个简单的数据结构,它将进行复制。 如果更复杂,则可能应使用copy.deepcopy

aux = copy.deepcopy(matriz)

顺便说一句,您不需要在每个语句后使用分号,python不会将它们用作EOL标记。

brc answered 2020-06-29T19:44:46Z
17 votes

使用复印模块

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

小一:不需要分号。

Shekhar answered 2020-06-29T19:45:10Z
4 votes

aux不是matrix的副本,只是引用同一对象的不同名称。

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

omz answered 2020-06-29T19:45:35Z
translate from https://stackoverflow.com:/questions/8122627/copied-variable-changes-the-original