Скопированная переменная меняет оригинал? - PullRequest
38 голосов
/ 14 ноября 2011

У меня есть простая проблема в 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 изменяется, несмотря на то, что 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]]

Ответы [ 3 ]

59 голосов
/ 14 ноября 2011

Строка

aux=matriz;

Не делает копию matriz, она просто создает новую ссылку на matriz с именем aux.Вы, вероятно, хотите

aux=matriz[:]

, который сделает копию, предполагая, что matriz - простая структура данных.Если он более сложный, вы, вероятно, должны использовать copy.deepcopy

aux = copy.deepcopy(matriz)

В качестве отступления, вам не нужны точки с запятой после каждого оператора, Python их не используетв качестве маркеров EOL.

14 голосов
/ 14 ноября 2011

Использование copy module

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

Minor one: точки с запятой не нужны.

4 голосов
/ 14 ноября 2011

aux - это , а не копия matrix, это просто другое имя, относящееся к тому же объекту.

Используйте модуль копирования длясоздавать актуальные копии ваших объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...