2016-02-16 2 views
1

Так что я не знаю, является ли это правильно сформулированным вопросом, и я сожалею, если это не так, но я довольно тупой. Кроме того, я не знаю, как представить минимальный рабочий пример, потому что я не могу воспроизвести поведение без всего кода, что немного большим для stackexchange.объект python меняет значение входной переменной

Итак, вот проблема: у меня есть объект, который принимает в качестве одного из своих аргументов массив numpy. (Если это помогает, этот массив представляет собой начальные условия для дифференциального уравнения, которое метод в моем объекте решает численно.) После использования этого массива для решения дифференциального уравнения он выводит ответ просто отлично, НО исходная переменная, в которой я сохраненный массив теперь изменил значение. Вот что я делаю:

import numpy as np 
import mycode as mc 

input_arr = np.ndarray(some_shape) 
foo = mc.MyClass(input_arr) 
foo.numerical_solve() 
some_output 

Изобразительное и денди. Но тогда, когда я проверяю input_arr, это значение изменилось. Иногда это то же самое, что и some_output (то есть конечное значение численного решения), но иногда это некоторый интерстициальный шаг.

Как я уже сказал, я полностью в тупике, и любые советы будут очень благодарны!

+1

Вам нужно покажите код своего класса и 'numerical_solve'. Предположительно, 'numerical_solve' мутирует массив (например, устанавливая в нем значения). – BrenBarn

+3

Нет причин, по которым 'MyClass' или' numeric_solve' не могут изменить 'input_arr' на месте, и это довольно часто. Иногда, например, это будет использоваться для экономии времени и/или пространства; например, оператор инфикса numpy (например, x + = 1) может быть быстрее, чем повторять копии массива. Если вы хотите сохранить оригинал, вы можете просто сделать копию, но * априори * изменение не указывает на проблему. – tom10

+1

Почему вы не используете копию? –

ответ

0

Если у вас есть изменяемый объект (list, set, numpy.array, ...), и вы не хотите его мутируют, то вам необходимо сделать копию и передать, что вместо:

l1 = [1, 2, 3] 
l2 = l1[:] 

s1 = set([1, 2, 3]) 
s2 = s1.copy() 

arr1 = np.ndarray(some_shape) 
arr2 = np.copy(arr1) 
Смежные вопросы