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?

Back to top