Метод list.copy() в Python, копия списка
Операция позволяет создавать мелкую копию последовательности. Метод sequence.copy() создает мелкую копию последовательности sequence .
Операция копирования последовательности sequence эквивалентна выполнению выражения sequence[:] .
Метод sequence.copy() был включен для обеспечения согласованности с интерфейсами изменяемых контейнеров, которые не поддерживают срезы, такие как dict и set . copy() не входит в состав ABC collections.abc.MutableSequence , но большинство классов изменяемых последовательностей предоставляют его.
Эта операция поддерживаются изменяемыми типами последовательностей.
Смотрите так же модуль copy , что бы сделать глубокую копию списка, а так же различия между глубокой и неглубокой копией.
Примеры копирования списка.
- Общие примеры копирования списка;
- Копирование списка срезом;
Общие примеры.
>>> x = [3, 6, 9, 12, 15, 18] >>> y = x.copy() >>> y[2] = 20000 >>> x # не изменился [3, 6, 9, 12, 15, 18] >>> y # Измененная копия x [3, 6, 20000, 12, 15, 18]
Альтернативная операция создания копии списка.
# Альтернативная операция создания копии >>> z = x[:] >>> z[-1] = 15000 >>> x # не изменился [3, 6, 9, 12, 15, 18] >>> z # Измененная копия x [3, 6, 9, 12, 15, 15000]
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Изменение/замена элемента списка по индексу
- Изменение части списка операцией среза
- Изменение списка срезом c заданным шагом
- Удаление части списка операцией среза
- Удаление части списка по срезу с заданным шагом
- Метод list.append(), добавляет значение в конец списка
- Метод list.clear(), очищает список
- Метод list.copy(), копия списка
- Метод list.extend(), расширяет список другой последовательностью
- Расширение списка его содержимым
- Метод list.insert(), вставить элемент по индексу
- Метод list.pop(), получение с удалением элемент списка
- Метод list.remove(), удаление элемента списка по значению
- Метод list.reverse(), разворачивает элементы списка
- Удаление элемента списка по индексу
- Удаление дубликатов из списка Python с сохранением очередности
Скопируйте или клонируйте список Python
В этом посте мы обсудим, как скопировать или клонировать список в Python.
Присваивания не копируют списки Python, поскольку они просто создают привязки между исходным и скопированным списками. Это означает, что изменения, сделанные в исходном списке, будут видны в скопированном списке. В этой статье рассматриваются различные способы выполнения общей операции неглубокого копирования в Python.
1. Использование copy() функция
Стандартное решение для возврата неглубокой копии списка — встроенный copy() функция. Эта функция доступна для списков, наборов и словарей.
Артём Санников
Данная книга является руководством для начинающих специалистов в области анализа и обработки данных. В книге рассматривается язык SQL и его процедурное расширение PL/SQL от компании Oracle.
Главная › Языки программирования › Python › Списки › Копирование списка в Python
Копирование списка в Python
Копирование списков очень удобная вещь, так как на основе одного списка можно создать другой за считанные секунды. Чтобы скопировать список, создайте срез, включающий весь исходный список без указания первого и последнего индекса [:] . Данная конструкция создаёт срез, который начинается с первого элемента и заканчивается последним, в результате этого создаётся копия списка.
# Текущий список users = ["Иванов", "Петров", "Сидоров"] # Создаём новый список и создаём срез для копирования старого списка new_users = users[:] # Выводим старый список print("Это старый список фамилий:") print(users) # Выводим новый список print("\nЭто новый список фамилий:") print(new_users) # Финальный результат в консоли Это старый список фамилий: ['Иванов', 'Петров', 'Сидоров'] Это новый список фамилий: ['Иванов', 'Петров', 'Сидоров']
Записи по теме
- Проверка отсутствия значения в списке Python
- Проверка вхождения значения в список Python
- Перебор содержимого среза списка в Python
- Срез для списка в Python
- Генератор списков в Python
- Создание числового списка при помощи range() в Python
- Перебор всего списка в Python
- Определение длины списка в Python
Зачем в Python есть два способа создания копии списка?
Возможно существуют более двух способов создания копии списка, кроме:
b = a[:] b = a.copy()
Но зачем нужно создавать два и более способов, когда легко можно обойтись всего одним способом?
Дополнение к вопросу:
Есть код:
a = [1 , 2, [3, 4]] b = a[:] c = a.copy() print(a) print(b) print(c) print() a[1] = 0 a[2][1] = 'xx' print(a) print(b) print(c)
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 0, [3, 'xx']] [1, 2, [3, 'xx']] [1, 2, [3, 'xx']]
Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются?
- Вопрос задан более трёх лет назад
- 11285 просмотров
Комментировать
Решения вопроса 2
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
Для операции среза копирование списка — это побочный эффект, а создана она для другого.
По поводу дополнения: читать про поверхностное и глубокое копирование.
Ответ написан более трёх лет назад
Нравится 5 1 комментарий

Это не баг — это фича)

Python Enthusiast
Приветствую, weranda.
. Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются.
Потому что [:], copy(), list() создают т.н. «поверхностные» копии. Используйте copy.deepcopy() для решения подобной проблемы:
>>> a = [1 , 2, [3, 4]] >>> import copy >>> b = copy.deepcopy(a) >>> a[2][1] = 156 >>> a [1, 2, [3, 156]] >>> b [1, 2, [3, 4]]
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 3
Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются?
Как мне кажется, нашел правильный ответ на этот вопрос. Операции a[:] и a.copy() — это операции поверхностного копирования, т.е. такого копирования, при котором создается новый объект (список в данном случае) и в него записываются ссылки на все вложенные объекты.
Операция = — это операция присваивания ссылки к объекту. Не копирование.
При первой операции: a[1] = 0 — происходит присваивание ссылки к новому объекту 0. В списках b, c при этом остались ссылки на старый объект 2. Почему ссылка к новому объекту? Потому что тип int — неизменяемый, при всех операциях присваивания с неизменяемыми типами происходит присваивание ссылки к новому объекту, а не изменение старого.
То есть:
a = 5
print(id(a)) # 4489501472
a = 2
print(id(a)) # 4489501376 — объект-то новый
При второй операции a[2][1] = ‘xx’ изменяется объект a[2] (а это список, изменяемый, поэтому ссылка на объект не изменилась, а изменился сам список). При копировании была скопирована ссылка на этот список a[2]. Список изменился, но ссылка осталась та же во всех переменных a, b, c.
P.S. лучше поздно, чем никогда :))
