Ændrende og uforanderlige i Python

Æ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.

YouTube Video