Næste Kapitel: Funktioner
Lavvandede og Dybe Kopi
Indledning
Som vi har set i kapitel “Data Typer og Variabler”, Python har en mærkelig adfærd – i sammenligning med andre programmerings sprog – ved tildeling og kopiering simple datatyper som heltal og strenge. Forskellen mellem lav og dyb kopiering er kun relevant for sammensatte objekter, som er objekter, der indeholder andre objekter, som lister eller klasseinstanser.,
i det følgende kodestykke y peger på den samme hukommelsesplacering end.. dette ændres, når vi tildeler en anden værdi til y. i dette tilfælde vil y modtage en separat hukommelsesplacering, som vi har set i kapitlet “datatyper og variabler”.
>>> x = 3>>> y = x
men selvom denne interne adfærd forekommer mærkelig sammenlignet med programmeringssprog som C, C++ og Perl, svarer de observerbare resultater af opgaverne vores forventninger. Men det kan være problematisk, hvis vi kopierer foranderlige objekter som lister og ordbøger.
Python opretter kun rigtige kopier, hvis det skal, dvs., hvis brugeren, programmøren, udtrykkeligt kræver det.
vi vil introducere dig til de mest afgørende problemer, som kan opstå, når du kopierer mutable objekter, dvs.når du kopierer lister og ordbøger.
kopiering af en liste
>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1
i eksemplet ovenfor er en simpel liste tildelt colours1. I næste trin tildeler vi colour1 til colours2. Herefter tildeles en ny liste til colours2.
som vi har forventet, forblev værdierne for colours1 uændrede., Ligesom det var i vores eksempeli kapitlet” datatyper og variabler”, en ny hukommelsesplacering var blevet tildelt til colours2, fordi vi har tildelt en komplet ny liste til denne variabel.
>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1
men spørgsmålet er, hvad vil der ske, hvis vi ændrer et element i listen over farver2 eller farver1?
i eksemplet ovenfor tildeler vi en ny værdi til det andet element i colours2. Masser af begyndere vil blive overrasket over, at listen over farver1 også er blevet” automatisk ” ændret.,
forklaringen er, at der ikke har været nogen ny tildeling til colours2, kun til et af dens elementer.
Kopiér med Skive Operatør
Det er muligt helt at kopiere lavvandede liste strukturer med skive operatøren, uden at have nogen af de bivirkninger, som vi har beskrevet ovenfor:
>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>>
Men så snart en liste, der indeholder underlister, vi har de samme problemer, dvs blot henvisninger til thesublists.,
>>> lst1 = ]>>> lst2 = lst1
Denne opførsel er vist i følgende diagram:
Hvis du har tildelt en ny værdi til 0 Element i den ene af de to lister, vil der ikke være nogen bivirkning. Der opstår problemer, hvis du ændrer et af elementerne i underlisten.
>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]
følgende diagram viser, hvad der sker, hvis et af elementerne i en underliste ændres: både indholdet af lst1 og lst2 ændres.,
brug af metoden deepcopy fra modulet copy
en løsning på de beskrevne problemer er at bruge modulet “copy”. Dette modul giver metoden” kopi”, som tillader en komplet kopi afen vilkårlig liste, dvs.lavvandede og andre lister.
følgende script bruger vores eksempel ovenfor, og denne metode:
from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1
Hvis vi gemme dette script under navn af deep_copy.py og hvis vi kalder scriptet med “python deep_copy.,py”, får vi følgende output:
$ python deep_copy.py ]]
Næste Kapitel: Funktioner