Если создать дубликат списка через присвоение (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
же не позволяет этого делать и заставляет компьютер создавать новый элемент, просто с такими же данными, а не ссылку на объект.