objects copy

Время чтения: меньше 5 мин

Кратко

Секция статьи "Кратко"

Когда речь заходит о копирований объектов, в Python используют 2 способа копирования:

  • Поверхностное копирование (shallow copy)
  • Глубокое копирование (deep copy)

Поверхностное копирование

Секция статьи "Поверхностное копирование"

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

Пример

Секция статьи "Пример"

Представим студента факультета инженерии и естественных наук по имени Алекс. У него есть определенный список предметов на курс, которые он должен посещать.
Спустя время, у Алекса появился новый согруппник Петя. Так как они оба на одной специальности, Пете тоже нужны эти предметы. Плюс, ох обоих записали на курсы английского.

        
          
          import copy# Предметы Алексаalex_lessons: dict[str, list[str]] = {  "semester1": ["Экономика", "Математика 1", "Физика 1"],  "semester2": ["Сопромат", "Математика 2", "Физика 2"],}alex_lessons.get("semester1", []).append("Английский")# Предметы Петиpetya_lessons: dict[str, list[str]] = copy.copy(alex_lessons)  # Оценки Олега (скопированы из списка Алисы)print("Alex's lessons: ", alex_lessons)print("Petya's lessons: ", petya_lessons)
          import copy
# Предметы Алекса
alex_lessons: dict[str, list[str]] = {
  "semester1": ["Экономика", "Математика 1", "Физика 1"],
  "semester2": ["Сопромат", "Математика 2", "Физика 2"],
}
alex_lessons.get("semester1", []).append("Английский")

# Предметы Пети
petya_lessons: dict[str, list[str]] = copy.copy(alex_lessons)  # Оценки Олега (скопированы из списка Алисы)

print("Alex's lessons: ", alex_lessons)
print("Petya's lessons: ", petya_lessons)

        
        
          
        
      

Глубокое копирование

Секция статьи "Глубокое копирование"

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

Пример

Секция статьи "Пример"

Давайте представим что у нас есть списки оценок Алисы, а также список Олега, который списывал всё у Алисы. Спустя какое-то время Олег самостоятельно получил ещё одну оценку в свой списокю Как это будет выглядеть:

        
          
          import copyalisa_grades: list[int] = [90, 85, 82]  # Оценки Алисыoleg_grades: list[int] = copy.deepcopy(alisa_grades)  # Оценки Олега (скопированы из списка Алисы)oleg_grades.insert(2, 95)print("Alisa's grades: ", alisa_grades)print("Oleg's grades: ", oleg_grades)
          import copy
alisa_grades: list[int] = [90, 85, 82]  # Оценки Алисы
oleg_grades: list[int] = copy.deepcopy(alisa_grades)  # Оценки Олега (скопированы из списка Алисы)

oleg_grades.insert(2, 95)

print("Alisa's grades: ", alisa_grades)
print("Oleg's grades: ", oleg_grades)

        
        
          
        
      

Дополнительно

Секция статьи "Дополнительно"

Бывают случаи когда надо создать поверхностную копию списка. Сделать это можно с помощью:

  • Сделать slice списка;
        
          
          first_list: list[int] = [1, 2, 3, 4]second_list = first_list[:]
          first_list: list[int] = [1, 2, 3, 4]
second_list = first_list[:]

        
        
          
        
      
  • Метод copy() у списка;
        
          
          first_list: list[int] = [1, 2, 3, 4]second_list = first_list.copy()
          first_list: list[int] = [1, 2, 3, 4]
second_list = first_list.copy()

        
        
          
        
      
  • Использовать built-in метод list().
        
          
          first_list: list[int] = [1, 2, 3, 4]second_list = list(first_list)
          first_list: list[int] = [1, 2, 3, 4]
second_list = list(first_list)