ProgramlamaBackend Python Geliştirici

Shallow copy ile normal değişken ataması arasındaki fark nedir? copy.copy() iç içe veri yapıları (liste içindeki listeler) açısından nasıl çalışır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Python'da değişken ataması (örneğin, a = b) nesneyi kopyalamaz, yalnızca mevcut nesneye yeni bir isim (referans) oluşturur. Eğer bu değişken değiştirilebilir bir nesne ise, bir isimle yapılan değişiklikler diğerinde de görünür.

Shallow copy (yüzeysel kopyalama), örneğin copy.copy(obj) veya liste için kesim [:] ile, üst düzeyde yeni bir nesne oluşturur, ancak içindeki gömme nesneler referansla kopyalanır (yani her iki yapı "aynı alt konteynırlara bakar"). Eğer gömme nesneleri değiştirirseniz, değişiklikler her iki nesne üzerinden de görünür.

Örnek:

import copy lst1 = [[1,2], [3,4]] lst2 = copy.copy(lst1) # veya lst1[:] lst1[0][0] = 100 print(lst2) # [[100, 2], [3, 4]]

lst2 yeni bir listedir, ancak birinci elemanı aynı gömme listedir.

Kandırmaca Soru

Soru: lst2 = lst1[:] ile lst2 = copy.copy(lst1) arasındaki fark nedir?

Cevap: Pratikte, normal (tek düzey) listeler için fark yoktur — her iki yöntem de listenin yüzeysel kopyasını yapar. Ancak, kullanıcı tanımlı konteyner sınıfları için farklı davranışlar olabilir (örneğin, __copy__ metodunu uyguladıysanız). Diğer türler (dict, set vb.) için özel kopyalama modülünü kullanmak daha güvenlidir.

import copy lst1 = [1, 2, 3] lst2 = lst1[:] lst3 = copy.copy(lst1) print(lst2 == lst3) # True

Konuyla ilgili ince detaylar yüzünden gerçek hata örnekleri


Hikaye

Bir konfigürasyon işleme projesinde, geliştirici varsayılan parametreleri params = default_params ile atayarak her birini "izole" olarak değiştirebileceğini düşündü. Sonuç olarak, her kopyada yapılan değişiklikler uygulamanın her yerinde bir değişim dalgasına yol açtı, çünkü aslında tek bir nesne ile çalışıyordu.


Hikaye

Deneyimsiz bir programcı, oyun durumlarını saklamak için liste için yüzeysel kopya kullandı (game_states = states[:]). İç içe yapı (sahnedeki figürlerin listesi) ile, bir durum içindeki değişiklikler diğerlerine "sızdı", geri alma ve hamle tekrarlarını bozarak tarihi kırdı.


Hikaye

Bir nesne yönelimli uygulamada verileri kopyalama çabası için kesim ile copy.copy() arasında seçim yapıldı. Ancak yapıda, yalnızca copy.copy() kullanıldığında dikkate alınan kendi copy metoduna sahip bir sınıfla karşılaşıldı. Kesim, nesne kopyalama mantığını göz ardı etti ve belirgin olmayan hatalar oluştu.