Как можно просто и желательно в одну строчку "клонировать" список?
В изначальном виде код выглядел вот так:
a = [1, 2, 2, 3, 3, 3]
for i in range(len(a)):
b = a
b.pop(i)
И предполагалось, что в каждом очередном проходе цикла for, список b будет представлять из себя список а без i-того элемента. Однако, в реальности, i-тый элемент выкидывался и из списка a, т.е., получается, что строка
b = a
не создавала еще один список b, который являлся точной копией списка а, а, по сути, присваивала одному списку два идетификатора a и b.
Избежать я этого смог следующим образом:
a = [1, 2, 2, 3, 3, 3]
c = ' '.join([str(s) for s in a])
for i in range(len(a)):
b = [int(s) for s in c.split()]
b.pop(i)
Однако, я уверен, что это лишний огород.
Как же можно просто, безболезнено, и желательно в одну строчку, "клонировать" список?
Ответы (2 шт):
Изменяемые объекты передаются по ссылке. Это значит, что при изменении значения переменной объект будет изменен. К этому типу относятся:
- списки (
list) - множества (
set) - словари (
dict)
Подводные камни
Создадим список a, установим для переменной b ссылку на a, прибавим к b элемент списка и выведем их значения и идентификаторы на экран:
a = [1, 2]
b = a
b.append(3)
print(a, b) # [1, 2, 3] [1, 2, 3]
print(id(a), id(b)) # 139748057891656 139748057891656
Как мы видим, переменные имеют одинаковые id и элементы списка. Если вы не знаете об этой особенности изменяемых объетов, то такое поведение программы становится полной неожиданностью и может привести к ошибке в работе программы.
Клонирование списков:
вариант 1:
clone = my_list.copy()вариант 2:
clone = my_list[:]-
from copy import deepcopy clone = deepcopy(my_list)