Ændrende og uforanderlige i Python
Denne artikel forklarer ændrende og uforanderlige i Python.
YouTube Video
Ændrende og uforanderlige i Python
"Ændrende" og "uforanderlige" refererer til ændringskapaciteten for et objekt. At forstå dette hjælper med at undgå uventede fejl og effektiv hukommelsesstyring.
Hvad er ændrende?
Ændrende objekter kan ændre deres interne tilstand efter oprettelse.
Primære ændrende datatyper
list
dict
set
- Brugerdefinerede klasser (hvis deres attributter kan ændres)
Eksempel: Ændring af en liste
1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers) # [100, 2, 3]
En liste er et ændrende objekt, og dens elementer kan frit ændres.
Hvad er uforanderlige?
Uforanderlige objekter kan ikke ændres, når de først er oprettet. Forsøg på at ændre dem resulterer i oprettelsen af et nyt objekt.
Primære uforanderlige datatyper
int
float
str
tuple
bool
frozenset
Eksempel: Ændring af en streng
1text = "hello"
2# text[0] = "H" # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:] # Creates a new string
5print(text) # "Hello"
Strenge er uforanderlige, så du kan ikke ændre dem delvist.
Sammenligning af ændrende og uforanderlige
1# Mutable example
2a = [1, 2, 3]
3b = a
4b[0] = 100
5print(a) # [100, 2, 3] -> a is also changed
6
7# Immutable example
8x = 10
9y = x
10y = 20
11print(x) # 10 -> x is unchanged
Som vist i eksemplet ovenfor deles ændrende objekter via reference, så de kan påvirke andre variabler. På den anden side skaber uforanderlige objekter nye instanser ved gen-tildeling, hvilket efterlader den oprindelige værdi uændret.
Undersøgelse af intern adfærd ved brug af id()
I Python kan du bruge id()
-funktionen til at kontrollere et objekts ID. Objekt-ID’et er tilsvarende en hukommelsesadresse.
1# Immutable int behavior
2a = 10
3print(id(a)) # e.g., 140715920176592
4a += 1
5print(id(a)) # e.g., 140715920176624 -> ID has changed
6
7# Mutable list behavior
8b = [1, 2, 3]
9print(id(b)) # e.g., 2819127951552
10b.append(4)
11print(id(b)) # Same ID -> only the content has changed
Som vist, oprettes et nyt objekt for uforanderlige typer, mens foranderlige typer ændres på stedet.
Funktioner og forsigtighed med foranderlige og uforanderlige objekter
Når man overfører et foranderligt objekt til en funktion, kan de oprindelige data blive ændret.
Eksempel: En funktion, der ændrer en liste
1def modify_list(lst):
2 lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list) # [1, 2, 3, 100]
Eksempel: En funktion, der ændrer et tal
På den anden side fører et forsøg på at ændre et uforanderligt objekt til, at der oprettes et nyt objekt.
1def modify_number(n):
2 n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number) # 5 -> unchanged
Praktiske overvejelser
Undgå at bruge foranderlige objekter som standardargumenter
1# Bad example
2def add_item(item, container=[]):
3 container.append(item)
4 return container
5
6print(add_item(1)) # [1]
7print(add_item(2)) # [1, 2] -> unintended behavior
8
9# Good example
10def add_item(item, container=None):
11 if container is None:
12 container = []
13 container.append(item)
14 return container
Da standardargumenter kun evalueres én gang ved funktionsdefinitionen, kan brugen af foranderlige objekter føre til uventede bivirkninger.
Sammendrag
For at forstå Pythons variabler og datatyper i dybden er det afgørende at fatte forskellene mellem foranderlige og uforanderlige. At forstå disse karakteristika hjælper dig med at undgå utilsigtet adfærd i din kode og skrive mere robuste og læsbare programmer.
Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.