Если создать дубликат списка через присвоение (s1 = s), то при изменении нового списка, будет меняться и старый?

собственно вопрос изложил выше. Заметил данную закономерность в следующем коде:

s1 = s
for i in range(len(s)):
    s1[i] = s[i][0]* ceil(s[i][1]/3)
    print(s,s1)

и в результате у меня выводит идентичные списки. Скажите это особенность питона? И что тогда делать, вместо присвоения через равно чтобы создать дубликат списка?


Ответы (1 шт):

Автор решения: ArseniyRybasov

Используйте модуль copy для этих целей. Он встроен, и ничего скачивать не надо. Пример:

import copy
import math

s = [[1, 2], [3, 4], [5, 6]]
s1 = copy.deepcopy(s)
for i in range(len(s)):
    s1[i] = s[i][0] * math.ceil(s[i][1]/3)
    print(s, s1)

Вывод:

[[1, 2], [3, 4], [5, 6]] [1, [3, 4], [5, 6]]
[[1, 2], [3, 4], [5, 6]] [1, 6, [5, 6]]
[[1, 2], [3, 4], [5, 6]] [1, 6, 10]

Как видите, списки s и s1 отличаются.

Проблема заключается в том, что компьютер в целях экономии памяти делает ссылку на массив, а не новый массив. Модуль copy же не позволяет этого делать и заставляет компьютер создавать новый элемент, просто с такими же данными, а не ссылку на объект.

→ Ссылка