Ett föränderligt objekt (mutable) kan ändras efter att det skapats. Ett oföränderligt objekt (immutable) kan inte ändras på det sättet. Detta är något annat än att tilldela en variabel ett nytt värde.
Föränderliga och oföränderliga typer
Listor, dictionaries och set är föränderliga. Heltal, flyttal, booleska värden, strängar och tupler är oföränderliga.
En ny tilldelning ändrar vad namnet refererar till
a = 10
b = a
a = 12
print(a) # 12
print(b) # 10Heltalet 10 ändras inte till 12. I stället låter tilldelningen namnet a referera till ett annat objekt.
Två namn kan dela samma lista
a = [1, 2, 3]
b = a
a[0] = 10
print(a) # [10, 2, 3]
print(b) # [10, 2, 3]
print(a is b) # TrueHär ändrar vi innehållet i det gemensamma listobjektet. Därför syns ändringen genom båda namnen.
Skapa en kopia när du behöver en egen lista
a = [1, 2, 3]
b = a.copy()
b[0] = 99
print(a) # [1, 2, 3]
print(b) # [99, 2, 3]
print(a is b) # FalseDetta är en ytlig kopia. Finns det listor inuti listan delas de inre objekten fortfarande. För en fullständig kopia av en sådan struktur kan copy.deepcopy() behövas.
Vad visar id()?
id(objekt) ger ett heltal som identifierar objektet under dess livstid. I CPython motsvarar det en minnesadress, men det är en implementationsdetalj. Två separat skapade heltal med samma värde behöver inte ha samma id. Jämför värden med == och identitet med is.