Következő Fejezet: Funkciók
Sekély, Mély Másolása
Bevezető
Mint láttuk a fejezet “Data Típusú Változók”, Piton különös magatartása – összehasonlítva más programozási nyelvek – ha hozzárendelése, illetve a másolás egyszerű adattípusok, mint egész szám, majd a szálakat. A sekély és mély másolás közötti különbség csak összetett objektumokra vonatkozik, amelyek más objektumokat, például listákat vagy osztálypéldányokat tartalmazó objektumok.,
a következő kódrészletben y ugyanarra a memóriahelyre mutat, mint X. ez megváltozik, amikor más értéket rendelünk y-hoz.ebben az esetben y külön memória helyet kap, amint azt az “adattípusok és változók”fejezetben láttuk.
>>> x = 3>>> y = x
de még akkor is, ha ez a belső viselkedés furcsának tűnik a C, C++ és Perl programozási nyelvekhez képest, mégis a feladatok megfigyelhető eredményei válaszolnak elvárásainkra. De problémás lehet, ha módosítható objektumokat, például listákat és szótárakat másolunk.
A Python csak akkor hoz létre valós példányokat, ha kell, azaz, ha a felhasználó, a programozó kifejezetten követeli meg.
bemutatjuk a legfontosabb problémákat, amelyek változékony objektumok másolásakor, azaz listák és szótárak másolásakor fordulhatnak elő.
lista másolása
>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1
a fenti példában egy egyszerű lista van hozzárendelve a colors1-hez. A következő lépésben a colour1-et a colors2-hez rendeljük. Ezt követően egy új lista van hozzárendelve a colors2-hez.
ahogy vártuk, a színek1 értékei változatlanok maradtak., Mint például a mi példánkbanaz “adattípusok és változók” fejezetben egy új memória helyet osztottunk ki a colors2 számára, mivel egy teljes új listát rendeltünk ehhez a változóhoz.
>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1
de a kérdés az, hogy mi fog történni, ha megváltoztatjuk a színek listájának egy elemét2 vagy színek1?
a fenti példában új értéket rendelünk a colors2 második eleméhez. Sok kezdő meglepődik, hogy a colors1 listája is “automatikusan” megváltozott.,
a magyarázat az, hogy nem volt új hozzárendelés a colors2-hez, csak az egyik eleméhez.
Másolás a Szelet Üzemeltető
Ez lehetséges, hogy teljesen másolás sekély lista szerkezetek a szelet üzemeltető anélkül, hogy bármely mellékhatás, amely már a fent leírt:
>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>>
De amint egy listát tartalmaz sublists, ugyanaz a nehézség, azaz csak mutatók thesublists.,
>>> lst1 = ]>>> lst2 = lst1
Ez a viselkedés a következő ábrán látható:
Ha új értéket rendel a két lista egyikének 0.eleméhez, akkor nem lesz mellékhatás. Problémák merülnek fel, ha megváltoztatja a sublist egyik elemét.
>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]
a következő ábra azt mutatja, hogy mi történik, ha egy allista egyik eleme megváltozik: mind az lst1, mind az lst2 tartalma megváltozik.,
módszerrel deepcopy a modulból copy
a leírt problémák megoldása a “másolás”modul használata. Ez a modul biztosítja a módszer “másolás”, amely lehetővé teszi a teljes másolatátegy tetszőleges lista, azaz sekély, valamint egyéb listák.
a következő szkript használja a fenti példánkat és ezt a módszert:
from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1
ha ezt a szkriptet a deep_copy.py ha a szkriptet “Python deep_copy” – nak hívjuk.,py”, a következő kimenetet kapjuk:
$ python deep_copy.py ]]
következő fejezet: funkciók