copy – objektumok másolása

Ez a modul két függvényt tartalmaz, melyekkel objektumokat másolhatsz.

A copy(object) ⇒ object egy “egyszerű” másolatot készít az objektumról. Az egyszerű azt jelenti, hogy az objektum másolásra kerül, de ha ez egy tároló (container) objektum, akkor annak elemei az eredeti objektum elemeire hivatkoznak.

Objektummásolás

A példában figyeljük meg a két lista elemeinek memóriacímét, mely a 9-es és a 3-as értékű elemeknél egyezik! Így látható, hogy mivel egy tároló objektumról van szó, az elemek az eredeti objektumra mutatnak.

# File: copy_objektum_masolas_1.py import copy a = [[1],[2],[3]] b = copy.copy(a) print "modositas elott", "=>" print a print b # az eredetit modositjuk a[0][0] = 9 # a nulladik elem egy lista, amelynek nulladik eleme 9 a[1] = None # FONTOS: a 0. elem valtozasa b-n is megfigyelheto, mig az 1. elem valtozasa NEM, mert az nem tarolo tipusu elem. print "modositas utan", "=>" print a print b print "elemek memoriacimenek ellenorzese:" print "a=>" for elem in a: print elem, id(elem) # FONTOS: a [9],[3] memoriacime ugyanaz, mint b [9],[3]-elemeknek! print "b=>" for elem in b: print elem, id(elem)
# File: copy_objektum_masolas_1.out

modositas elott =>
[[1], [2], [3]]
[[1], [2], [3]]
modositas utan =>
[[9], None, [3]]
[[9], [2], [3]]
elemek memoriacimenek ellenorzese:
a=>
[9] 10787416
None 505028048
[3] 10787976
b=>
[9] 10787416
[2] 10798544
[3] 10787976

Egyszerű másolás teljes szeleteléssel, vagy a copy() metódussal

# File: copy_objektum_masolas_egyszeru_szeletelessel.py import copy a = [[1],[2],[3]] b = a[:] vasarolni = {"anyanak":"sampon", "apanak":"sakk-keszlet"} c= vasarolni.copy() # lathato, hogy a masolat elemeinek memoriacime ugyanaz mint az eredetinek. print "elemek memoriacimenek ellenorzese:" print "a=>" for elem in a: print elem, id(elem) print "b=>" for elem in b: print elem, id(elem) print "c=>" print c # COPY metodusa a szotarnak van, listanak NINCS
# File: copy_objektum_masolas_egyszeru_szeletelessel.out

elemek memoriacimenek ellenorzese:
a=>
[1] 10791512
[2] 10802640
[3] 10792072
b=>
[1] 10791512
[2] 10802640
[3] 10792072
c=>
{'anyanak': 'sampon', 'apanak': 'sakk-keszlet'}

Rekurzív objektummásolás

A deepcopy(object) ⇒ object függvénnyel teljes, rekurzív másolatot készíthetsz az objektumról – ha az tároló típusó (lista például), az objektum minden eleme másolásra kerül.

# File: copy_objektumok_rekurziv_masolasa.py import copy a = [[1],[2],[3]] b = copy.deepcopy(a) print "modositas elott", "=>" print a print b # az eredetit modositjuk a[0][0] = 0 a[1] = None print "modositas utan", "=>" print a print b # elemek memoriacime kulonbozo, tehat kulon peldanyok leteznek print "a =>" for elem in a: print elem, id(elem) print "b =>" for elem in b: print elem, id(elem)
# File: copy_objektumok_rekurziv_masolasa.out

modositas elott =>
[[1], [2], [3]]
[[1], [2], [3]]
modositas utan =>
[[0], None, [3]]
[[1], [2], [3]]
a =>
[0] 10787416
None 505028048
[3] 10787976
b =>
[1] 10788056
[2] 10788336
[3] 10788016

Post Comments

You must be logged in to post a comment.