ProgramlamaVeri Mühendisi

Yüzeysel kopya (shallow copy) ve derin kopya (deep copy) arasındaki farkı açıklayın ve karmaşık nesnelerin kopyalanmasında copy.copy ve copy.deepcopy'in davranışını ele alın. Yanlış bir anlamanın bir hataya yol açtığı bir örnek verin.

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

Cevap.

Yüzeysel kopya (shallow copy) yeni bir üst seviye nesne oluşturur, ancak iç içe geçmiş nesneler (liste elemanları, iç içe geçmiş sözlükler vb.) orijinal ile bellek paylaşır. Derin kopya (deep copy) tüm nesne seviyelerini özyinelemeli olarak kopyalar.

copy modülü aracılığıyla kullanılabilir:

import copy original = [[1, 2], [3, 4]] shallow = copy.copy(original) deep = copy.deepcopy(original) shallow[0][0] = 99 # Hem original hem de shallow'ı değiştirir print(original) # [[99, 2], [3, 4]] # Şimdi deep ile original = [[1, 2], [3, 4]] deep = copy.deepcopy(original) deep[0][0] = 99 print(original) # [[1, 2], [3, 4]]

Özellikler:

  • copy.copy(obj): sadece "sarmalayıcıyı" kopyalar
  • copy.deepcopy(obj): tamamen özyinelemeli kopyalama
  • Bazı nesneler (örneğin, açık dosyalar, soketler) deep copy ile kopyalanmaz (istisna)

Hileli Soru.

Değiştirilebilir nesneleri içeren bir demeti kopyalarken ne olur?

Cevap ve örnek:

tuple değiştirilemez, ancak onun elemanları değiştirilebilir olabilir (örneğin, bir liste). Yüzeysel kopya ve derin kopya arasındaki farklar:

import copy t = ([1, 2], [3, 4]) shallow = copy.copy(t) deep = copy.deepcopy(t) shallow[0][0] = 99 print(t) # ([99, 2], [3, 4]) # Derin kopyada: t = ([1, 2], [3, 4]) deep = copy.deepcopy(t) deep[0][0] = 88 print(t) # ([1, 2], [3, 4])

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye

Belge işleme uygulamasında veriler, bir sözlüğün içindeki bir listede tutuluyordu. Nesneleri copy.copy ile kopyaladıklarında, iç içe geçmiş elemanlar yanlış bir şekilde yeni nesnenin modifikasyonu sırasında değişiyordu. Sonuç olarak, sistemin diğer bölümlerindeki orijinal veriler değişti! Veri bozulması yaşandı. Sadece deepcopy ile değiştirerek çözüldü.


Hikaye

Makine öğrenimi projesinde, model hiperparametrelerini kaydederken, yapılandırma listesini standart atama ve yüzeysel kopya ile kopyaladık, ardından farklı deneyler birbirinin parametrelerini karşılıklı olarak değiştirdi. Hatanın kaynağını iç içe listelerin derin kopyalama davranışını teşhis ettikten sonra bulduk.


Hikaye

Finans yazılımında, açık bir dosya (handle) içeren bir nesneye yanlışlıkla derin kopya uygulandı, bu da TypeError: cannot pickle '_io.TextIOWrapper' object hatasına yol açtı - çünkü copy.deepcopy altında pickle kullanıyor. Bu, bu tür alanların açıkça işlenmesi veya yüzeysel kopya çağrısı yoluyla düzeltildi.