Dict anlayış.() kopya sığ ya da derin? | Netgez.com
SORU
20 EKİM 2010, ÇARŞAMBA


Dict anlayış.() kopya sığ ya da derin?

dict.copy(), belgeleri okuma sırasında sözlük sığ bir kopyasını yapar diyor. Onlar da takip ediyorum kitabı (Beazley. Python Referans) için de geçerli:

M.() kopyalama yöntemi, sığ yapar öğeleri bir yer kopyala eşleme nesnesi ve bir yerleştirir yeni haritalama nesne.

Bu göz önünde bulundurun:

>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}

Bu original güncelleme değeri tahmin ettim yani (': 3) c sığ bir kopyasını yapıyordum beri de ekleyin. Eğer bir liste yaparsanız gibi:

>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])

Bu beklendiği gibi çalışır.

Hem sığ kopya olduğundan, neden dict.copy() beklediğim gibi çalışmıyor mu? Sığ ya da derin kopyalama vs benim anlayışı kusurludur?

CEVAP
20 EKİM 2010, ÇARŞAMBA


"Sığ kopyalama" anlamına geliyoriçeriksözlüğün değeri tarafından kopyalanmış, ama sadece yeni bir referans oluşturmak.

>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

Buna karşılık, derin bir kopyasını değeri ile tüm içeriğini kopyalar.

>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

Yani:

  1. a = b: Referans atama, a ve aynı nesne için b puan.

    a ---,
         v
         {1: L}
         ^   |
    b ---'   '----> [1,2,3]
    
  2. a = b.copy(): Sığ kopyalama a b iki izole nesneleri olacak, ama içindekiler hala aynı referans paylaşın

    a ---> {1: L}
               |             
               >---> [1,2,3]
               |
    b ---> {1: M}
    
  3. a = copy.deepcopy(b): Derin kopyalama a b'nın yapısı ve içeriği tamamen izole olmak.

    a ---> {1: L}
               ‘-----> [1,2,3]
    b ---> {1: M}
               ‘-----> [1,2,3]
    

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • Facebook Developers

    Facebook Dev

    24 ÅžUBAT 2009