Мелкий список копий - PullRequest
       13

Мелкий список копий

0 голосов
/ 10 апреля 2020

Я плохо пытаюсь выяснить, что здесь происходит, с помощью следующего мелкого списка.

В этом коде после модификации мелкой копии списка (matrix2), где мы заменить весь список в списке, изменения отражаются только для матрицы2, но не для матрицы1, хотя матрица2 является поверхностной копией матрицы1.

>>> matrix1 = [[1, 2], [3, 4]]
>>> matrix2 = matrix1[:]
>>> matrix2[0] = [5, 6]
>>> matrix2
[[5, 6], [3, 4]]
>>> matrix1
[[1, 2], [3, 4]]

В этой части кода результат отличается, поскольку изменение значение в одном списке списка отражается для обеих матриц.

>>> matrix2[1][0] = 1
>>> matrix2
[[5, 6], [1, 4]]
>>> matrix1
[[1, 2], [1, 4]]

Я обнаружил следующее: Это происходит потому, что список на самом деле не содержит сами объекты, но ссылки на эти объекты в памяти. Когда вы создаете копию списка, используя обозначение [:], возвращается новый список, содержащий те же ссылки, что и исходный список.

Можете ли вы помочь мне выяснить, что на самом деле означает приведенный выше текст? может, я что-то здесь упускаю и сам не могу найти ответ.

1 Ответ

1 голос
/ 10 апреля 2020

Например, у вас есть список matrix1=[[1,2], [3,4]], и вы присвоили его matrix2 = matrix1. Когда вы присваиваете matrix1 matrix2, он просто передает ссылку, но не создает новый массив. Теперь, если вы измените какие-либо данные в matrix1 или matrix2, изменения будут применяться к обоим спискам.

Но если вы используете операцию срезов, это создаст новый список matrix2 = matrix1[:]. Теперь, если вы измените какие-либо данные в matrix2 или matrix1, изменения будут применены соответственно.

Примечание: операция среза приводит к полному копированию списка.

matrix2[0][0] = x это изменится в обоих списках, поскольку мелкое копирование мелкое копирование применяется только к одному уровню, например matrix2[0] = [x,y].

Если вы не хотите изменять данные, вы можете используйте deepcopy. Он копирует каждый объект рекурсивно.

...