🌞 Niespodziewane zachowania
Przypisanie tworzy referencję, a nie kopię
W Pythonie przypisanie listy do innej zmiennej nie tworzy nowej kopii, lecz odniesienie do tej samej struktury danych.
L = [1,2,3,4]
M = [1,2,3,L,4]
print(f"Wartość zmiennej M przed zmianą L: {M}")
L[1] = "woooow"
print(f"Wartość zmiennej M po zmianie L: {M}")
Dlaczego tak się dzieje?
Mzawiera referencję doL, a nie jej kopię.- Gdy zmienimy element w
L, zmiana jest widoczna również wM, ponieważ odwołuje się do tej samej instancji obiektu.
Powtórzenie dodaje jeden poziom zagłębienia
L = [4,5,6]
X = L * 4
Y = [L] * 4
print(f"X: {X}, Y: {Y}")
L[1] = "wow"
print(f"X: {X}, Y: {Y}")
Dlaczego tak się dzieje?
X = L * 4tworzy nową listę powielając zawartośćLjako wartości skalarneY = [L] * 4powiela odniesienie do listyL, nie tworząc nowych instancji- Po zmianie elementu w
L, efekt jest widoczny wY, ale nie wX, ponieważXzawiera wartości skopiowane
Głębsza analiza kopiowania list
L = [4,5,6]
Y = [list(L)] * 4
L[1] = "wow"
print(f"Y: {Y}")
Y[0][1] = "wow"
print(f"Y: {Y}")
Dlaczego tak się dzieje?
[list(L)] * 4tworzy listę zawierającą cztery referencje do tej samej kopiilist(L)- Modyfikacja
Lnie wpłynie naY, ponieważlist(L)tworzy nową instancję - Jednak zmiana
Y[0][1]spowoduje zmianę we wszystkich elementachY, ponieważ wszystkie odwołują się do tej samej listy