DeepCopy значения пустого массива внутри цикла for - PullRequest
0 голосов
/ 08 июня 2018

У меня есть массив с именем initial_matrix, и внутри цикла for на каждом шаге цикла я хочу случайным образом изменить один из индексов этого массива (каждый раз другой) и обработать мою матрицу.

init_matrix = deepcopy(my_matrix)
for i in range(0, 30):

       new_mat, rep_index = replace_index(my_matrix, value)
       ...// proceed with my process

Функция replace_index случайным образом объединяет один индекс матрицы со значением.Я заметил, что по результатам замены это происходит не только до new_mat, но и до my_matrix.Тем не менее, я хочу, чтобы на каждом этапе цикла использовалась моя исходная матрица, а не та, что была после замены массива.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Если вы не хотите изменять текущую функцию (my_matrix, value), вы можете просто передать копию этой функции с помощью:

new_mat, rep_index = replace_index(my_matrix.copy(), value)

Краткое объяснение:
Эта проблема обычно возникает вpython, всякий раз, когда вы передаете изменяемый в функцию . Mutables , такие как np.ndarray, list или dict , будут переданы функции по ссылке .Это означает, что все операции, выполненные над ними, можно увидеть во внешней области, если вы не перепроверете ссылку.Операции перепривязки обычно представляют собой операции, которые изменяют адрес памяти объекта, такие как добавление, конкатенация, копирование, просто перезапись новым объектом и т. Д.и новый тип, очевидно, будет list), тогда как a[:] = [1., 2., 3.] - нет, поскольку a[:] = обращается к основной области памяти для назначения значений, тогда как a = ... перепривязывает ссылку a.

0 голосов
/ 08 июня 2018

В replace_index () создайте копию my_matrix и используйте ее.

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