Nästa kapitel: funktioner
grunt och djupt kopia
introduktion
som vi har sett i kapitlet ”datatyper och variabler” har Python ett konstigt beteende – i jämförelse med andra programmeringsspråk – när man tilldelar och kopierar enkla datatyper som heltal och strängar. Skillnaden mellan grunt och djupt kopiering är endast relevant för sammansatta objekt, som är objekt som innehåller andra objekt, som listor eller klassinstanser.,
i följande kodavsnitt y pekar på samma minnesplats än X. Detta ändras när vi tilldelar ett annat värde till y. i det här fallet kommer y att få en separat minnesplats, som vi har sett i kapitlet ”datatyper och variabler”.
>>> x = 3>>> y = x
men även om detta interna beteende verkar konstigt jämfört med programmeringsspråk som C, C++ och Perl, svarar de observerbara resultaten av uppdragen våra förväntningar. Men det kan vara problematiskt om vi kopierar muterbara objekt som listor och ordböcker.
Python skapar verkliga kopior endast om det måste, dvs, om användaren, programmeraren, uttryckligen kräver det.
vi kommer att introducera dig till de mest avgörande problemen, som kan uppstå vid kopiering av muterbara objekt, d.v.s. vid kopiering av listor och ordböcker.
kopiera en lista
>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1
I exemplet ovan tilldelas en enkel lista till färger1. I nästa steg tilldelar vi colour1 till colours2. Därefter tilldelas en ny lista till Colours 2.
som vi har förväntat oss var värdena för färger1 oförändrade., Liksom det var i vårt exempeli kapitlet ”datatyper och variabler” hade en ny minnesplats tilldelats för färger2, eftersom vi har tilldelat en komplett ny lista till denna variabel.
>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1
men frågan är vad som händer om vi ändrar ett element i listan över färger2 eller färger1?
i exemplet ovan tilldelar vi ett nytt värde till det andra elementet i färger2. Massor av nybörjare kommer att bli förvånad över att listan över färger1 har ”automatiskt” ändrats också.,
förklaringen är att det inte har skett någon ny tilldelning till färger2, bara till ett av dess element.
Kopiera med Slice-operatören
det är möjligt att helt kopiera grunda liststrukturer med slice-operatören utan att ha några biverkningar, som vi har beskrivit ovan:
>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>>
men så snart en lista innehåller sublister har vi samma svårighet, dvs bara pekar på publiceringarna.,
>>> lst1 = ]>>> lst2 = lst1
detta beteende visas i följande diagram:
om du tilldelar ett nytt värde till det 0: e elementet i en av de två listorna kommer det inte att bli någon bieffekt. Problem uppstår, om du ändrar ett av elementen i underlistan.
>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]
följande diagram visar vad som händer om ett av elementen i en underlista ändras: både innehållet i lst1 och lst2 ändras.,
använda metoden deepcopy från Modulkopian
en lösning på de beskrivna problemen är att använda modulen ”copy”. Denna modul ger metoden ”kopiera”, vilket möjliggör en fullständig kopia aven godtycklig lista, dvs grunda och andra listor.
följande skript använder vårt exempel ovan och den här metoden:
from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1
om vi sparar det här skriptet under namnet deep_copy.py och om vi kallar skriptet med ” python deep_copy.,Py”, vi kommer att få följande utgång:
$ python deep_copy.py ]]
Nästa kapitel: funktioner