14 Temmuz 2011 Perşembe

Python'da listenin kopyasını almak

Python da her eşitlik referans gösterir. Bu iddalı lafın anlamını şöyle ifade edeyim.
Örneğin şekildeki gibi bir liste = başka bir liste şeklinde kopya almaya çalıştığınızda şöyle bir gariplik (aslında güzellik) ile karşılaşırsınız.

a = ["a","b","c"]
>>> b = a
>>> b.append("d")
>>> print a, b
['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd']
Nesnelere gelince yine aynı mantık, nesne = başkabirnesne dediğinizde referans göstermiş oluyorsrunuz :

>> class obj:
...     def __init__(self):
...         self.counter = 0
...     def inc(self):
...         self.counter += 1
... 
>>> a = obj()
>>> b = a
>>> a.inc()
>>> print a.counter
1
>>> print b.counter
1
Bir nesnenin ya da değişkenin kopyasını almak istediğinizde çeşitli yöntemler var, sanırım verilerin (list, tuple, dict vs) kopyasını alırken karşılaştığım en yakışıklı yöntem şu :

>>> a = ["a","b","c"]
>>> b = list(a)
>>> print a , b
['a', 'b', 'c'] ['a', 'b', 'c']
>>> a.append("d")
>>> print a, b
['a', 'b', 'c', 'd'] ['a', 'b', 'c']

Peki bir nesnenin kopyasını almak istiyorsak? bunun için copy adında bir modül yapmışlar:

>>> class obj:
...     def __init__(self):
...         self.counter = 0
...     def inc(self):
...         self.counter += 1
... 
>>> a = obj()
>>> from copy import copy
>>> b = copy(a)
>>> a.inc()
>>> b.inc()
>>> b.inc()
>>> b.inc()
>>> print a.counter, b.counter
1 3

Eğer copy modülünden deepcopy fonksionunu import eder kullanırsak, nesneyi özyinelemeli olarak kopyalıyormuş. Herkese iyi hafta sonları :)

1 yorum:

  1. Hi………….
    Thanks for Your great information , I like it !!!!

    Is any one give info releted to cosmetic surgery Burun estetiği ??

    Hello all Dr.Yakupavsar one of best Op.Dr in cosmetic surgery. His company name Yakup Avsar. the very famous compnay releted to plastic surgery & cosmetic surgery etc..... One best think this person is doing most of the turkey Actor and actress plastic surgery and nose surgery and cosmetic surgery .

    you must take advice form him related to this matter. for the better know you contact this address www.yakupavsar.com
    Mardin Ebulula Street Violet Street Number: 1
    Akatlar / Istanbul (Bjk College Behind) pin-304080
    Burun estetigi

    YanıtlaSil

Yorum yazan eller dert görmeye