Copied variable changes the original?
Question:
I have a simple problem in Python that is very very strange.
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)
...
As you see below, the matrix matriz
is changed in spite of the fact that aux
is the one being changed by the function solucoes()
.
Matrix before:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]
Matrix after:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705],
[0.0, 0.0, -3.0, -3.0000000000000018]]
Answers:
aux
is not a copy of matrix
, it’s just a different name that refers to the same object.
Use the copy module to create actual copies of your objects.
The line
aux=matriz;
Does not make a copy of matriz
, it merely creates a new reference to matriz
named aux
. You probably want
aux=matriz[:]
Which will make a copy, assuming matriz
is a simple data structure. If it is more complex, you should probably use copy.deepcopy
aux = copy.deepcopy(matriz)
As an aside, you don’t need semi-colons after each statement, python doesn’t use them as EOL markers.
Use copy module
aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying
Minor one: semicolons are not needed.
I have a simple problem in Python that is very very strange.
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)
...
As you see below, the matrix matriz
is changed in spite of the fact that aux
is the one being changed by the function solucoes()
.
Matrix before:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]
Matrix after:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705],
[0.0, 0.0, -3.0, -3.0000000000000018]]
aux
is not a copy of matrix
, it’s just a different name that refers to the same object.
Use the copy module to create actual copies of your objects.
The line
aux=matriz;
Does not make a copy of matriz
, it merely creates a new reference to matriz
named aux
. You probably want
aux=matriz[:]
Which will make a copy, assuming matriz
is a simple data structure. If it is more complex, you should probably use copy.deepcopy
aux = copy.deepcopy(matriz)
As an aside, you don’t need semi-colons after each statement, python doesn’t use them as EOL markers.
Use copy module
aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying
Minor one: semicolons are not needed.