🐍

Mutabilitate si Referinte

Programare Python Avansat 1 min citire 0 cuvinte

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 = a creeaza referinta, nu copie
  • a[:] sau copy() fac shallow copy
  • deepcopy() pentru copie completa
  • NICIODATA [] sau {} ca default in functii!

📚 Articole Corelate