Python'da Liste Nasıl Kopyalanır (Sığ ve Derin Kopya)

Python'da bir listenin nasıl kopyalanacağını öğrenin. Liste dilimlemeyi, copy() yöntemini, liste oluşturucularını keşfedin ve sığ ve derin kopyalar arasındaki farkta uzmanlaşın.

Bu Çözümü Editör'de deneyin

Genel Bakış

Python'da listeler değiştirilebilir nesnelerdir ve değişkenler gerçek değerlerden ziyade bellekte bu nesnelere yönelik referansları tutar. Bu, yeni bir değişkene (örneğin, 'list_b = liste_a') bir liste atarsanız, her iki değişkenin de tam olarak aynı listeye referans verdiği anlamına gelir. 'list_b' aracılığıyla yapılan herhangi bir değişiklik, 'list_a'yı hemen etkileyecektir. Bu yan etkiyi önlemek için listenin açık bir kopyasını oluşturmalısınız.

Python bir listenin yüzeysel bir kopyasını oluşturmak için çeşitli yollar sunar. Sığ bir kopya, orijinal listede bulunan öğelere referanslar içeren yeni bir liste oluşturur. Yaygın yöntemler arasında yerleşik liste `.copy()` yönteminin kullanılması, liste dilimleme `list_a[:]` kullanılması veya listenin `list()` yapıcısına aktarılması yer alır. Bunların tümü, öğeleri bağımsız olarak eklemenize veya kaldırmanıza olanak tanıyan yeni bir liste kapsayıcısı oluşturur.

Bununla birlikte, bir liste iç içe geçmiş değiştirilebilir nesneler içeriyorsa (listeler veya sözlükler gibi), yüzeysel bir kopya yalnızca dış kapsayıcıyı kopyalayacaktır; iç içe geçmiş nesneler paylaşılmış olarak kalır. Kopyadaki iç içe geçmiş bir listeyi değiştirmek, orijinal listeyi değiştirecektir. Bunu önlemek için, hiyerarşi içindeki her nesneyi yinelemeli olarak klonlayan 'kopya' modülünün 'deepcopy()' işlevini kullanarak derin bir kopyalama gerçekleştirmelisiniz.

Kod ve Yürütme Çıkışı

Bu kod, referans atama tuzağını, list.copy() kullanarak yüzeysel kopyalamayı ve copy modülünü kullanarak iç içe geçmiş listelerin derin kopyalamasını gösterir.

copy_lists.py
Editör'de deneyin
import copy

# 1. The assignment reference trap (Not a copy!)
original = [1, 2, 3]
reference = original
reference.append(99)
print("Reference modification affects original:", original)

# Reset list
original = [1, 2, 3]

# 2. Creating a shallow copy (using list.copy())
shallow_copy = original.copy()
shallow_copy.append(100)
print("\nOriginal:", original)
print("Shallow copy:", shallow_copy)

# 3. The nested list limitation of shallow copies
nested = [[1, 2], [3, 4]]
shallow_nested = nested.copy()
shallow_nested[0].append(99) # Modifying nested list
print("\nOriginal nested:", nested)
print("Shallow nested copy:", shallow_nested)

# 4. Creating a deep copy
nested_original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(nested_original)
deep_copy[0].append(99)
print("\nOriginal nested:", nested_original)
print("Deep copy (completely independent):", deep_copy)
Terminal Çıkışı
Reference modification affects original: [1, 2, 3, 99]

Original: [1, 2, 3]
Shallow copy: [1, 2, 3, 100]

Original nested: [[1, 2, 99], [3, 4]]
Shallow nested copy: [[1, 2, 99], [3, 4]]

Original nested: [[1, 2], [3, 4]]
Deep copy (completely independent): [[1, 2, 99], [3, 4]]

Adım Adım Uygulama

  • Düz liste yapılarının yüzeysel bir kopyasını oluşturmak için my_list.copy() veya my_list[:] kullanın.
  • Bağımsız koleksiyonlara ihtiyaç duyduğunuzda copy_list = my_list gibi referans atamalarından kaçının.
  • Kopya modülünü içe aktarın ve iç içe değiştirilebilir yapılar içeren listeler için copy.deepcopy(my_list) öğesini kullanın.
  • Performansı ve bellek ayak izini optimize etmek için veri yapılarınızı anladığınızdan emin olun.

Sıkça Sorulan Sorular

Sığ kopya ile derin kopya arasındaki fark nedir?

Sığ bir kopya, en dıştaki kabı kopyalar, ancak iç içe geçmiş değiştirilebilir nesnelere referans verir. Derin kopya, tüm iç içe geçmiş kapsayıcıları ve nesneleri yinelemeli olarak kopyalayarak tamamen yalıtılmış veri yapılarıyla sonuçlanır.

Liste dilimleme (list[:]), list.copy() işleminden daha hızlı mıdır?

Her ikisi de optimize edilmiş C işlemlerini arka planda yürüttüğü için performans açısından hemen hemen aynıdırlar. Okunabilirlik açısından genellikle list.copy() işlevinin kullanılması tercih edilir.

İlgili Konular

Önerilen Python Kaynakları

İlgili etkileşimli eğitimler, yardımcı sayfalar ve kod karşılaştırmalarıyla bilginizi genişletin.