Ek: Aliasing ve kopyalama alıştırmaları
Aliasing ve kopyalama alıştırmaları
Bu sayfa 9. bölümdeki şu konuyu tekrar ettirir: iki ad aynı değiştirilebilir (mutable) nesneyi gösterebilir. Her soruda önce nesneleri ve onları gösteren adları kâğıda çizin.
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ı ama iç listeler iki listede ortak.
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 bir liste döndürür.
B: Hangi adlar aynı nesneyi gösteriyor? (4 soru)
Her soruda aynı nesneyi gösteren adları gruplayı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 ile b aynı listeyi gösterir, c ayrı bir listedir.
B2: x, y ve z aynı listeyi gösterir, k ayrı bir listedir.
B3: a ile b farklı dış listelerdir, ama a[0] is b[0] ve a[1] is b[1] True verir.
B4: Son satırdaki atama ilk adını yeni [9] listesine bağlar. ikinci hâlâ eski [5] listesini gösterir.
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 fonksiyona gelen listenin kendisini değiştirir.
C2: sayilar [1, 2] kalır, sonuc [1, 2, 10] olur. veri + [10] yeni bir liste oluşturur ve yerel veri adı artık o listeyi gösterir.
C3: tablo da yeni de [[1, 99], [2]] yazdırır. Dış liste kopyalandı ama ilk iç liste iki listede ortak.
Her atamada sorulacak soru
Bir atama gördüğünüzde hemen “kopyalandı” demeyin. Önce şunu sorun:
Bu satır yeni bir nesne mi oluşturuyor, yoksa var olan nesneye yalnızca yeni bir ad mı veriyor?