Почему при копировании одного массива в другой изменяются оба массива?

Я пытаюсь решить задачу 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))
Другие вопросы по тегам