Mutabilitate si Referinte
Obiecte Mutabile vs Imutabile
| Mutabile | Imutabile |
|---|---|
| list | int, float |
| dict | str |
| set | tuple |
| frozenset | |
| bool |
Referinte in Python
Variabilele sunt referinte la obiecte, nu containere:
a = [1, 2, 3]
b = a # b refera ACELASI obiect!
b.append(4)
print(a) # [1, 2, 3, 4] - modificat si a!
# Verificare identitate
print(a is b) # True - acelasi obiect
Copiere vs Referinta
Shallow Copy:
import copy
a = [1, 2, [3, 4]]
b = a[:] # sau a.copy() sau list(a)
b[0] = 99
print(a) # [1, 2, [3, 4]] - OK
b[2].append(5)
print(a) # [1, 2, [3, 4, 5]] - modificat!
Deep Copy:
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
b[2].append(5)
print(a) # [1, 2, [3, 4]] - neschimbat!
Efecte in Functii
def modifica_lista(lst):
lst.append(4) # Modifica originalul!
lst = [9, 9, 9] # Reatribuire locala, nu afecteaza
numere = [1, 2, 3]
modifica_lista(numere)
print(numere) # [1, 2, 3, 4]
Capcana cu Default Mutabil
# GRESIT!
def adauga(elem, lista=[]):
lista.append(elem)
return lista
print(adauga(1)) # [1]
print(adauga(2)) # [1, 2] - Nu [2]!
# CORECT
def adauga(elem, lista=None):
if lista is None:
lista = []
lista.append(elem)
return lista
Imutabilitate si Reatribuire
# String-urile sunt imutabile
s = "hello"
s = s + " world" # Creeaza string NOU
# Echivalent pentru liste (dar ineficient)
a = [1, 2]
a = a + [3] # Creeaza lista NOUA
a.append(4) # Modifica in-place (eficient)
Verificare id()
a = [1, 2, 3]
print(id(a)) # ex: 140234567890
a.append(4) # Modificare in-place
print(id(a)) # ACELASI id!
a = a + [5] # Reatribuire
print(id(a)) # ID DIFERIT!
Puncte Cheie pentru Examen
- Liste, dict, set sunt mutabile
- String, tuple, int, float sunt imutabile
b = acreeaza referinta, nu copiea[:]saucopy()fac shallow copydeepcopy()pentru copie completa- NICIODATA
[]sau{}ca default in functii!