Előző Fejezet: Beállítja, valamint a Fagyasztott Beállítja
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 ]]

előző fejezet: készletek és fagyasztott készletek
következő fejezet: funkciók

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük