Rozdział 11 · Mnóstwo informacji!
Listy kopiowania
Kopiowanie zewnętrznego lista jest łatwe, ale listy zagnieżdżone w nim pozostają domyślnie współdzielone. Przyjrzyjmy się, dlaczego i co z tym zrobić.
Trzy Bezpieczne Sposoby Kopiowania lista
sposoby_kopirovaniya.py
original = [1, 2, 3]
kopiya_1 = original.copy()
kopiya_2 = list(original)
kopiya_3 = original[:]
kopiya_1.append(4)
print(original) # [1, 2, 3] — nie zmieniło się
print(kopiya_1) # [1, 2, 3, 4]
Wszystkie trzy sposoby tworzą nową ZEWNĘTRZNĄ lista. Ale co jeśli same elementy są Listy?
Powierzchowna kopia (shallow copy) to ważny niuans
shallow_copy_trap.py
original = [["Anna", 10], ["Bob", 20]]
kopiya = original.copy()
kopiya[0][1] = 999
print(original) # [['Anna', 999], ['Bob', 20]] — również się zmieniło!
. copy() kopiuje tylko jeden poziom gnieżdżenia
.copy() (oraz list(...), i cięcie [:]) tworzą nowy zewnętrzny lista, ale nie kopiować zagnieżdżone listy w jego obrębie — pozostają one współdzielone. To się nazywa powierzchowna kopia (shallow copy). Modyfikacja podlisty poprzez kopię jest również widoczna w oryginale.copy.deepcopy() — gdy potrzebna jest całkowicie niezależna kopia
deepcopy.py
import copy
original = [["Anna", 10], ["Bob", 20]]
polnaya_kopiya = copy.deepcopy(original)
polnaya_kopiya[0][1] = 999
print(original) # [['Anna', 10], ['Bob', 20]] — nie zmieniło się
deepcopy nie zawsze jest poprawną odpowiedzią z definicji
copy.deepcopy() rekurencyjnie próbuje skopiować całą zagnieżdżoną strukturę w całości. Rozwiązuje to powyższy problem, ale dla dużych lub skomplikowanych struktur głębokie kopiowanie może być zauważalnie wolniejsze i nie zawsze jest potrzebne — często wystarczy skopiować tylko poziom, który faktycznie będzie się zmieniał.Praktyka: kopiowanie list i powierzchowne kopiowanie
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji