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.
Przykład
#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"])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
#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
#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])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)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] * 3tworzy 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
#- list.copy()Zwraca płytką kopię listy.
- list()Tworzy listę, pustą albo z elementów innego obiektu iterowalnego.
- dict()Tworzy słownik z par klucz–wartość lub argumentów nazwanych.
- Wycinki list [start:stop:step]Pobieranie, zamiana i usuwanie fragmentów listy po indeksach.
- dict.update()Dopisuje do słownika pary z innego słownika lub argumentów, nadpisując istniejące klucze.
Widzisz błąd albo brakuje przykładu? Napisz do nas.