Почему при копировании одного массива в другой изменяются оба массива?
Я пытаюсь решить задачу 8puzzle, и для этого мне нужны соседние элементы текущего состояния.
Текущее состояние (или данные) выглядит так - 2D-массив с 0, представляющим пустое состояние.
1 0 2
3 4 5
6 7 8
Я создал функцию, которая принимает 5 аргументов - нулевое положение x и y (a,b)
x и y позиция индекса элемента, который нужно поменять местами (c,d)
данные, то есть массив, который является текущим состоянием платы
Эта функция меняет местами пустую позицию с соответствующим элементом в массиве, а затем сохраняет текущую доску в списке result_state. Затем он снова меняет местами два значения обратно в исходное положение, чтобы позже можно было рассчитать больше новых состояний. Вот как это выглядит -
def append_in_list(self,a,b,c,d,data=None):
#print(data)
#print(store_values)
result_state = []
tmp = data[a][b]
data[a][b] = data[c][d]
data[c][d] = tmp
for i in range(0,len(data)):
result_state.append(data[i])
print(result_state)
tmp = data[c][d]
data[c][d] = data[a][b]
data[a][b] = tmp
#print(data)
print(result_state)
return result_state
Результатом этого является то, что когда он запускается один раз, это -
[[1, 4, 2], [3, 0, 5], [6, 7, 8]]
[[1, 0, 2], [3, 4, 5], [6, 7, 8]]
Почему изменяется result_state, если в нем нет изменений?
Ожидаемый результат -
[[1, 4, 2], [3, 0, 5], [6, 7, 8]]
[[1, 4, 2], [3, 0, 5], [6, 7, 8]]
Может кто-нибудь указать на ошибку, которую я совершаю?
Кроме того, мне нужно сохранить вывод этой функции в списке, который будет содержать несколько элементов, каждый из которых является выходом этой функции. Как мне это сделать?
Спасибо заранее за вашу помощь.
1 ответ
Использование:
# Creates a new list (copy of data[i]).
# This operation is O(len(data[i])).
result_state.append(data[i][:])
Вместо того:
# Does not create a new list (does not copy data[i]).
# Both result_state[i] and data[i] points to the same list.
# Hence, any modification will be visible in both of them.
# This operation is O(1).
result_state.append(data[i])
Кроме того, мне нужно сохранить вывод этой функции в списке, который будет содержать несколько элементов, каждый из которых является выходом этой функции. Как мне это сделать?
outputs = []
outputs.append(append_in_list(0, 1, 1, 1, data))