web-dev-qa-db-fra.com

La variable copiée change l'original?

J'ai un problème simple dans Python qui est très très étrange.

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)

...

Comme vous le voyez ci-dessous, la matrice matriz est modifiée malgré le fait que aux est celle qui est modifiée par la fonction solucoes().

Matrice avant:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

Matrice après:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

44
André Freitas

La ligne

aux=matriz;

Ne fait pas de copie de matriz, il crée simplement une nouvelle référence à matriz nommée aux. Tu veux probablement

aux=matriz[:]

Ce qui fera une copie, en supposant que matriz est une structure de données simple. S'il est plus complexe, vous devriez probablement utiliser copy.deepcopy

aux = copy.deepcopy(matriz)

En passant, vous n'avez pas besoin de points-virgules après chaque instruction, python ne les utilise pas comme marqueurs EOL.

65
brc

Utilisez le module copie

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

Mineure: les points-virgules ne sont pas nécessaires.

15
Shekhar

aux n'est pas pas une copie de matrix, c'est juste un nom différent qui fait référence au même objet.

Utilisez le module de copie pour créer des copies réelles de vos objets.

4
omz