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

And*_*tas 48 python variables

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

...
Run Code Online (Sandbox Code Playgroud)

如下所示,matriz尽管aux函数已更改了矩阵,但矩阵仍会发生变化solucoes().

矩阵之前:
[[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]]

brc*_*brc 69

这条线

aux=matriz;
Run Code Online (Sandbox Code Playgroud)

不制作副本matriz,它只是创建一个matriz名为的新引用aux.你可能想要

aux=matriz[:]
Run Code Online (Sandbox Code Playgroud)

这将是一个副本,假设matriz是一个简单的数据结构.如果它更复杂,你应该使用copy.deepcopy

aux = copy.deepcopy(matriz)
Run Code Online (Sandbox Code Playgroud)

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

  • 因为你正在改变`a`指向另一个对象(整数'3`),但不改变`b`,所以它仍然指向'1`. (6认同)
  • 嗨,感谢您的回答 =) 但是考虑到这个事实,我还有一个问题:如果 b=1 和 a=b,如果我们更改 a=3,则 b 在 python 中不会更改。为什么?谢谢=) (3认同)
  • 正是我想要的。另外仅供参考:如果你想深度复制 `dict` 结构,你可能需要 `dictionary.copy()` (2认同)

She*_*har 17

使用复制模块

aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying
Run Code Online (Sandbox Code Playgroud)

次要的:不需要分号.

  • 欢迎来到 stackoverflow @AndréFreitas。通常在这里,接受其中一个答案(您认为最好的答案,不一定是我的答案)被认为是一种良好的社区实践。 (2认同)

omz*_*omz 5

aux不是副本matrix,它只是一个不同的名称指的是同一个对象。

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