copy

Kopiowanie obiektów: płytka kopia copy() współdzieli zagnieżdżone obiekty z oryginałem, a głęboka deepcopy() kopiuje wszystko.

Zwraca
Nowy obiekt: płytką albo głęboką kopię oryginału.
Na tej stronie

Przykład

#
Python
import copy

team = {"name": "Czerwoni", "members": ["Ania", "Kuba"]}

alias = team
shallow = copy.copy(team)
deep = copy.deepcopy(team)

team["members"].append("Ola")
team["name"] = "Czerwone Smoki"

print(alias["name"], alias["members"])
print(shallow["name"], shallow["members"])
print(deep["name"], deep["members"])
Wynikzapisany wynik, możesz go sprawdzić
Czerwone Smoki ['Ania', 'Kuba', 'Ola']
Czerwoni ['Ania', 'Kuba', 'Ola']
Czerwoni ['Ania', 'Kuba']

alias to ten sam słownik, więc widzi obie zmiany. Płytka kopia ma własną nazwę drużyny, ale tę samą listę członków. Głęboka kopia nie zmieniła się wcale.

Definicja i zastosowanie

#

Przypisanie b = a nie kopiuje danych, tylko tworzy drugą nazwę dla tego samego obiektu, więc zmiana listy przez b jest widoczna także przez a. Moduł copy udostępnia dwie funkcje do tworzenia prawdziwych kopii: copy.copy() (płytka kopia) i copy.deepcopy() (głęboka kopia).

Płytka kopia tworzy nowy obiekt zewnętrzny, ale jego elementy wskazują na te same obiekty co w oryginale. Przy liście liczb czy napisów to wystarcza. Przy liście list albo słowniku z listami zmiana zagnieżdżonej listy w kopii zmieni też oryginał. Płytką kopię tworzą również lista.copy(), slownik.copy(), list(lista) i wycinek lista[:].

Głęboka kopia rekurencyjnie kopiuje wszystkie zagnieżdżone obiekty, więc wynik jest całkowicie niezależny od oryginału. Działa wolniej, ale jest bezpieczna przy złożonych strukturach, np. stanie gry albo konfiguracji, którą chcesz zmienić bez naruszania wzorca. Obie funkcje obsługują też obiekty własnych klas. Od Pythona 3.13 dostępna jest dodatkowo funkcja copy.replace(), która tworzy kopię ze zmienionymi polami, np. obiektu @dataclass.

Składnia

#
Składnia
import copy

copy.copy(obiekt)
copy.deepcopy(obiekt)

Parametry

#
  • obiekt

    dowolny obiekt

    Obiekt do skopiowania: lista, słownik, zbiór albo obiekt własnej klasy.

Więcej przykładów

#
Lista list: pułapka płytkiej kopii
Python
import copy

board = [[0, 0], [0, 0]]
shallow = board.copy()
deep = copy.deepcopy(board)

shallow[0][0] = 1
deep[1][1] = 9

print(board)
print(shallow)
print(deep)
print(board[0] is shallow[0], board[0] is deep[0])
Wynikzapisany wynik, możesz go sprawdzić
[[1, 0], [0, 0]]
[[1, 0], [0, 0]]
[[0, 0], [0, 9]]
True False
Kopia obiektu własnej klasy
Python
import copy

class Character:
    def __init__(self, name, inventory):
        self.name = name
        self.inventory = inventory

hero = Character("Ania", ["miecz", "mapa"])
clone = copy.deepcopy(hero)
clone.name = "Klon Ani"
clone.inventory.append("tarcza")

print(hero.name, hero.inventory)
print(clone.name, clone.inventory)
Wynikzapisany wynik, możesz go sprawdzić
Ania ['miecz', 'mapa']
Klon Ani ['miecz', 'mapa', 'tarcza']

Dobre praktyki

#
  • Jeśli struktura zawiera tylko liczby, napisy i krotki takich wartości, wystarczy płytka kopia. deepcopy() stosuj przy zagnieżdżonych listach, słownikach i obiektach.
  • Zapis [[0] * 3] * 3 tworzy trzy odwołania do jednej listy. Planszę twórz wyrażeniem [[0] * 3 for _ in range(3)].
  • To, czy dwie nazwy wskazują ten sam obiekt, sprawdzisz operatorem is.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.