Ek Çalışma — Aliasing ve Kopyalama
Aliasing ve kopyalama çalışma seti
Bu set 9. bölümdeki en kritik ayrımı tekrar ettirir: iki ad aynı mutable nesneyi gösterebilir. Her soruda önce nesneleri ve adları kâğıda çizmeniz önerilir.
A — Çıktı ne olur? (8 soru)
A1
a = [1, 2]
b = a
b.append(3)
print(a)A2
a = [1, 2]
b = a.copy()
b.append(3)
print(a)
print(b)A3
a = [10, 20]
b = a
b[1] = 99
print(a[1])A4
a = [[1], [2]]
b = a.copy()
b[0].append(9)
print(a)A5
a = [1, 2, 3]
b = a
c = b
c.pop()
print(a)
print(a is c)A6
a = [4, 5]
b = a[:]
b[0] = 40
print(a)
print(b)A7
a = [3, 1, 2]
b = a
b.sort()
print(a)A8
a = [3, 1, 2]
b = sorted(a)
print(a)
print(b)A1: [1, 2, 3]
A2: [1, 2] ve [1, 2, 3]
A3: 99
A4: [[1, 9], [2]]; dış liste kopyalandı, iç listeler paylaşılıyor.
A5: [1, 2] ve True
A6: [4, 5] ve [40, 5]
A7: [1, 2, 3]; .sort() aynı listeyi yerinde değiştirir.
A8: [3, 1, 2] ve [1, 2, 3]; sorted() yeni liste üretir.
B — Hangi adlar aynı nesneyi gösteriyor? (4 soru)
Her soruda aynı nesneye bağlı ad gruplarını yazın.
B1
a = [1]
b = a
c = a.copy()B2
x = [1, 2]
y = x
z = y
k = x[:]B3
a = [[1], [2]]
b = a.copy()Dış listeler ve iç listeler için ayrı cevap verin.
B4
ilk = [5]
ikinci = ilk
ilk = [9]Son satırdan sonra ilk ve ikinci neyi gösterir?
B1: a ve b aynı liste; c ayrı dış liste.
B2: x, y, z aynı liste; k ayrı liste.
B3: a ve b farklı dış listeler; fakat a[0] is b[0] ve a[1] is b[1] doğrudur.
B4: yeniden atama ilk adını yeni [9] listesine bağlar; ikinci eski [5] listesini göstermeye devam eder.
C — Fonksiyon çağrısı dışarıdaki listeyi değiştirir mi? (3 soru)
C1
def ekle(veri):
veri.append(10)
sayilar = [1, 2]
ekle(sayilar)
print(sayilar)C2
def ekle(veri):
veri = veri + [10]
return veri
sayilar = [1, 2]
sonuc = ekle(sayilar)
print(sayilar)
print(sonuc)C3
def ilk_satiri_degistir(tablo):
kopya = tablo.copy()
kopya[0].append(99)
return kopya
tablo = [[1], [2]]
yeni = ilk_satiri_degistir(tablo)
print(tablo)
print(yeni)C1: dışarıdaki sayilar değişir ve [1, 2, 10] olur; append aynı mutable listeyi değiştirir.
C2: sayilar [1, 2] kalır; sonuc [1, 2, 10] olur. veri + [10] yeni liste üretir ve yerel adı ona bağlar.
C3: hem tablo hem yeni [[1, 99], [2]] görünür. Dış liste kopyalansa da ilk iç liste paylaşılmaktadır.
Kapanış kontrolü
Bir atama gördüğünüzde otomatik olarak “kopyalandı” demeyin. Şu soruyu sorun:
Bu satır yeni bir nesne mi üretiyor, yoksa yalnızca yeni bir adı var olan nesneye mi bağlıyor?