Рубрики
Без рубрики

Список Python Copy ()

Удивительно, что даже продвинутые кодеры Python не знают подробности метода копирования () списков Python. Время изменить это! Определение и использование: Метод list.copy () копирует все элементы списка в новый список. Новый список – это возвращаемое значение метода. Это неглубокая копия — Вы копируете только ссылки на объект на … Python Список копии () Подробнее »

Автор оригинала: Chris.

Удивительно, что даже продвинутые кодеры Python не знают деталей Копировать () Метод списков Python. Время изменить это!

Определение и использование: list.copy () Метод копирует все Список элементы в новый список. Новый список – это возвращаемое значение метода. Это неглубокая копия – вы копируете только ссылки на объект на элементы списка, а не сами объекты.

Вот краткий пример:

>>> lst = [1, 2, 3]
>>> lst.copy()
[1, 2, 3]

В первой строке вы создаете список lst состоящий из трех целых чисел. Затем вы создаете новый список, скопировав все элементы.

Синтаксис : Вы можете вызвать этот метод на каждом объекте списка в Python. Вот синтаксис:

list.copy ()

Аргументы: Метод не имеет никакого аргумента.

Возвращаемое значение: Метод list.clear () Возвращает Список Объект, копируя ссылки на все объекты в исходном списке.

Видео:

Статьи по Теме:

  • Окончательное руководство по спискам Python

Вот ваш бесплатный PDF чит-лист, показывающий вас все методы списка Python на одной простой странице. Нажмите на изображение, чтобы загрузить файл PDF с высоким разрешением, распечатать его и опубликовать его в свою офисную стену:

Список Python Copy

Прежде чем вы действительно можете понять Копировать () Способ в Python, вы должны понимать концепцию «мелкой копии».

На объектно-ориентированных языках, таких как Python, все – это объект. Список – это объект, а элементы в списке тоже объекты. Неглубокая копия списка создает новый объект списка – копия – но она не создает новых элементов списка, но просто копирует ссылки на эти объекты.

Вы можете видеть, что указанный ниже – это только неглубокая копия, указывающая на те же элементы, что и исходный список.

В Python, list.copy () Способ производит только мелкую копию, которая имеет гораздо более быструю сложность выполнения.

Вот пример, показывающий точный этот сценарий:

>>> lst = [6, 7, [1, 2], "hello"]
>>> lst_2 = lst.copy()
>>> lst_2[2].append(42)
>>> lst[2]
[1, 2, 42]

Изменение третьего элемента списка скопированного списка влияет на элемент третьего списка исходного списка.

Список Python Скопируйте глубокий

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

Вот простая глубокая копия того же списка, как показано ранее:

В отличие от мелкой копии, список [1, 2] копируется отдельно для глубокого списка копирования. Если один изменяет этот вложенный список в исходном списке, изменение не будет видно в глубокой копии. (Потому что вложенный список глубокого списка копирования является независимым объектом в памяти.)

Обратите внимание, что в глубокой копии строковый объект не должен быть скопирован. Почему? Поскольку строки неизменяются, поэтому вы не можете их изменить (и, таким образом, не будут грязных «побочных эффектов», видимых другими копиями списка, указывающих на тот же объект в памяти.

Чтобы получить глубокую копию в Python, используйте Копировать модуль и использовать Deepcopy () Метод:

>>> import copy
>>> lst = [6, 7, [1, 2], "hello"]
>>> lst_2 = copy.deepcopy(lst)
>>> lst_2[2].append(42)
>>> lst[2]
[1, 2]

Как скопировать список Python (альтернативы)?

Скажи, вы хотите скопировать список . Какие варианты есть?

list.copy () Возвращает неглубокую копию списка.
Import Copy Copy.deepcopy (список) Импортируйте модуль копирования и использует его способ для создания глубокой копии списка.
список[:] Используйте Slicing с индексами по умолчанию для создания неглубокой копии списка.
Список (х) Используйте список встроенного списка (…), чтобы создать неглубокую копию списка X.
[ EL для EL в LST] Используйте список пометков для создания неглубокой копии исходного списка LST.

Нарезка относится к самым быстрым методам (очень грязные эталон здесь ). Если вам нужно обновить навыки нарезки Python, вот учебник по блогу Finxter:

Статьи по Теме:

  • Введение в нарезку в Python

Копия списка Python не работает

Основная причина, почему list.copy () Способ может не работать для вас, потому что вы предполагаете, что он создает глубокую копию, когда на самом деле он создает только неглубокую копию списка. Чтобы создать глубокую копию, где сами элементы списка копируются (например, для многомерных списков), просто импортируйте Скопировать Модуль и использовать его метод Deepcopy (x) Чтобы скопировать список х Отказ

>>> import copy
>>> lst = [[1, 2], 3, 4]
>>> lst_2 = copy.deepcopy(lst)

Список питона Скопируйте и добавьте

Как скопировать список и добавить элемент в одной строке кода Python?

Просто используйте нарезку, чтобы скопировать список и Список конкатенации Оператор + Чтобы добавить список одного элемента [x] к результату. Но тоже есть и другие хорошие способы. Проверьте следующие способы добавления элемента х до данного списка lst и вернуть результат как копию:

  • lst [:] + [x]
  • lst.copy () + [x]
  • [* lst, x]

Третий способ скопировать список и добавление нового элемента – мой личный фаворит, потому что это быстро, легко читается и кратко. Он использует оператор Asterisk для распадания элементов исходного списка в новый список.

Список Python Copy по значению

Вы хотите скопировать все элементы в вашем списке «по значению»? Другими словами, вы хотите не только объект «Список» (неглубокую копию), но и элементы списка (глубокая копия).

Это можно сделать с Deepcopy () Метод Python Скопировать библиотека. Вот пример:

>>> import copy
>>> lst = [6, 7, [1, 2], "hello"]
>>> lst_2 = copy.deepcopy(lst)
>>> lst_2[2].append(42)
>>> lst[2]
[1, 2]

Элемент 42 не был добавлен в вложенный список lst Отказ

Список питона копия с ломтиком

Вы можете просто скопировать список lst Используя операцию ломтики lst [:] С начать и остановить индексы запуска по умолчанию, чтобы все элементы скопированы в списке. Это создает неглубокую копию списка lst Отказ

Статьи по Теме:

  • Введение в нарезку в Python

Список списка Python без первого элемента

Чтобы скопировать список без своего первого элемента, просто используйте нарезку Список [1:] . Установив индекс запуска до 1, все элементы с указателем больше или равны 1, скопированы в новый список.

Вот пример:

>>> lst = [1, 2, 3, 4]
>>> lst[1:]
[2, 3, 4]

Список Python Copy без последнего элемента

Чтобы скопировать список без последнего элемента, просто используйте нарезку Список [: - 1] Отказ Установив индекс запуска до -1 (элемент списка правого списка) все элементы, но последний копируется в новый список.

Вот пример:

>>> lst = [1, 2, 3, 4]
>>> lst[:-1]
[1, 2, 3]

Список копирования списка Python

Сложность с временем неглубокого списка копировании-примеры являются list.copy () или нарезки Список [:] – линейный на количество элементов в списке. Для N элементов списка «Сложность времени» является O (n). Почему? Поскольку Python переходит на все элементы в списке и добавляет копию ссылки на объект на новый список (копирование по ссылке).

Я написал быстрый скрипт для оценки того, что временная сложность копирования списка на самом деле является линейным в количестве элементов списка:

import matplotlib.pyplot as plt
import time

y = []
for i in [100000 * j for j in range(10)]:
    lst = list(range(i))
    t0 = time.time()
    lst_2 = lst[:]
    t1 = time.time()
    y.append(t1-t0)


plt.plot(y)
plt.xlabel("List elements (10**5)")
plt.ylabel("Time (sec)")
plt.show()

Вот результат:

Время выполнения вырастает линейно в количестве элементов списка.

Список Python копирует частично

Как скопировать список частично? Копировать только элементы между Начать Индекс (включен) и Стоп Индекс (исключен), используйте Slicing, как это: Список [Пуск: Стоп] Отказ Это приводит к новому списку, который содержит только части списка.

Список Python Копировать многомерный список

Чтобы скопировать многомерный список (список списков), вам необходимо создать глубокую копию. Вы можете выполнить это с помощью метода deepcopy () библиотеки копирования следующим образом:

>>> import copy
>>> lst = [[1, 2, 3], [4, 5, 6]]
>>> lst_2 = copy.deepcopy(lst)
>>> lst_2
[[1, 2, 3], [4, 5, 6]]

Теперь проверьте, действительно ли копия глубокая, очищая элемент первого списка в копию:

>>> lst_2[0].clear()
>>> lst
[[1, 2, 3], [4, 5, 6]]
>>> lst_2
[[], [4, 5, 6]]

Вы можете увидеть, что копия была действительно глубокой, потому что первый элемент lst не пострадал от Очистить () Метод что удалили все элементы для глубокой копии lst_2 Отказ

Список Python Copy () Безопасность потоков

У вас есть несколько потоков, которые одновременно получают доступ к вашему списку? Затем вы должны быть уверены, что операции списка (например, Copy () ) на самом деле резьба безопасна Отказ

Другими словами: вы можете позвонить в Копировать () Операция в двух потоках в том же списке одновременно? (И вы можете быть уверены, что результат является значимым?)

Ответ да (если вы используете Mokef Cpython внедрение). Причина – Питона Блокировка глобального интерпретатора Это гарантирует, что поток, работающий в данный момент в этом коде, сначала завершит текущую базовую операцию Python, как определено реализацией CPYPHON. Только если оно завершится с помощью этой операции, сможет получить следующий поток для доступа к вычислительному ресурсу. Это обеспечивается сложной схемой блокировки в результате реализации CPYPHON.

Единственное, что вам нужно знать, состоит в том, что каждая основная операция в реализации CPYPHON является атомный Отказ Он выполнен полностью и сразу, прежде чем любой другой поток имеет возможность запустить на одном виртуальном двигателе. Поэтому нет условий расы. Примером для такого состояния гонки будет следующее: Первый поток считывает значение из списка, вторые потоки перезаписывают значение, и первая тема перезаписывает значение снова недействительным в операции второго потока.

Все операции Cpython являются потоковыми безопасными. Но если вы объединяете эти операции на функции более высокого уровня, это не в целом без резьбы, поскольку они состоят из многих (возможно, чередующихся) операций.

Куда пойти отсюда?

list.copy () Метод создает неглубокую копию Список Отказ copy.deepcopy (список) Метод создает глубокую копию список .

Вы узнали INS и ауты этого важного способа списка Python.

Если вы продолжаете бороться с теми основными командами Python, и вы чувствуете застрявшие в своем прогрессе обучения, у меня есть что-то для вас: Python One-listers (Amazon Link).

В книге я дам вам тщательный обзор темы критических компьютерных наук, таких как машинное обучение, регулярное выражение, наука о данных, Numpy и Python Basics – все в одной линейке кода Python!

Получите книгу от Amazon!

Официальная книга Описание: Python One-Listers покажет читателям, как выполнить полезные задачи с одной строкой кода Python. Следуя краткому переподготовку Python, книга охватывает важные продвинутые темы, такие как нарезка, понимание списка, вещание, функции лямбда, алгоритмы, регулярные выражения, нейронные сети, логистические регрессии и др .. Каждая из 50 секций книг вводит проблему для решения, проходит читателя через навыки, необходимые для решения этой проблемы, затем предоставляет краткое однонаправленное решение Python с подробным объяснением.

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/python-list-copy/”