İçeriğe geç
academia.sh

Ders 02 / 18

Değişkenler ve Bağlama

Adın değere bağlanması, atamanın anlamı, iki değişken modeli ve adlandırma kuralları.

İçindekiler

Önceki derste olcum_1 = 12 yazıldı ve bunun bir değer sakladığı söylendi. Bu ders o cümlenin altını doldurur: ad ile değer arasındaki bağ nasıl kurulur, ne zaman değişir ve bellekte neye karşılık gelir?

Soru göründüğünden daha derindir, çünkü diller bu bağı iki farklı biçimde modeller ve aradaki fark, ilerideki derslerde gözlenebilir sonuçlar doğurur.

Atama Bir Bağlama İşlemidir

olcum_1 = 12 deyimi iki adımda yürütülür:

  1. Eşittir işaretinin sağındaki ifade değerlendirilir; bir değer üretilir.
  2. Bu değer, soldaki ada bağlanır.

Sıra önemlidir. toplam = toplam + 5 deyimi, matematikte anlamsız bir denklem gibi görünür; program olarak ise açıktır: önce sağdaki ifade hesaplanır (eski değere 55 eklenir), sonra sonuç aynı ada yeniden bağlanır.

Bu nedenle eşittir işareti burada “eşitlik” değil, “bağla” anlamındadır. Bazı diller karışıklığı önlemek için := gibi ayrı bir simge kullanır; eşitlik sınaması ise genellikle == ile yazılır.

Değişken Ne Tutar: İki Model

Diller değişkeni iki farklı biçimde modeller. Fark, önceki kursta kurulan bellek modeliyle birlikte düşünüldüğünde netleşir.

Bellek gözü modeli. Değişken, belirli bir tür için ayrılmış adlandırılmış bir bellek alanıdır. Atama, o alanın içeriğini değiştirir. Değişkenin adresi ömrü boyunca sabittir; değişen, içindeki bit örüntüsüdür. Alt seviyeli dillerin çoğu bu modeli kullanır.

Ad–nesne bağı modeli. Değerler bellekte bağımsız nesneler olarak durur; değişken ise bu nesnelerden birine takılmış bir etikettir. Atama, nesnenin içeriğini değiştirmez; etiketi başka bir nesneye taşır. Aynı nesneye birden çok etiket takılabilir.

İki modelin gözlenebilir farkı, iki değişkenin aynı veriyi paylaşıp paylaşmadığında ortaya çıkar:

a = [1, 2, 3]      # bir liste nesnesi; 'a' ona bağlandı
b = a              # 'b' aynı nesneye bağlandı; kopya yok
b.append(4)

print(a)           # [1, 2, 3, 4]  — 'a' üzerinden de görülüyor
print(a is b)      # True          — aynı nesne
print(a == b)      # True          — aynı içerik

c = [1, 2, 3, 4]
print(a is c)      # False         — farklı nesneler
print(a == c)      # True          — aynı içerik

is işleci kimlik sorar: iki ad aynı nesneye mi bağlı? == işleci eşitlik sorar: içerikleri aynı mı? İki sorunun karıştırılması, paylaşılan veriyle çalışan programların yaygın hata kaynağıdır.

Bu ayrım, fonksiyonlara argüman aktarımı dersinde tekrar karşınıza çıkacak; oradaki “değer mi referans mı” tartışması, buradaki iki modelin doğrudan sonucudur.

Paylaşımı kırmanın yolu, açıkça kopya üretmektir. Kopyalamanın da iki derinliği vardır: yalnızca dış kabuğu kopyalayan sığ kopya ve iç içe tüm yapıyı kopyalayan derin kopya. Sığ kopyada iç nesneler hâlâ paylaşılır; bu, kopyalandığı sanılan verinin beklenmedik biçimde değişmesinin yaygın nedenidir. Kopyalama maliyeti veri büyüdükçe arttığından, paylaşmak ile kopyalamak arasındaki seçim bir tasarım kararıdır.

Yeniden Bağlama ve Sıra

Bir ad, program boyunca farklı değerlere bağlanabilir. Bu, sırayla ilgili bir tuzağı da beraberinde getirir: iki değişkenin değerlerini takas etmek, doğrudan iki atamayla yapılamaz.

x = 3
y = 7

# Yanlış: ilk atamadan sonra x'in eski değeri kaybolur.
x = y
y = x
print(x, y)        # 7 7  — takas olmadı

# Doğru: geçici bir ad kullanılır.
x, y = 3, 7
gecici = x
x = y
y = gecici
print(x, y)        # 7 3

Bazı diller çoklu atamayı destekler ve takas tek satıra iner (x, y = y, x); bu yazımda sağ taraf tümüyle değerlendirilip sonra bağlama yapıldığı için geçici ada gerek kalmaz. Sözdizim kolaylığı, altta yatan kuralı değiştirmez.

Tanımlanmamış Ad

Bir ada, bağlanmadan önce erişilirse ne olur? Yanıt, dilin değişken modeline bağlıdır ve bu, iki modelin ikinci gözlenebilir farkıdır.

Ad–nesne bağı modelinde ad henüz hiçbir nesneye bağlı değildir; erişim, açık bir hata verir:

# print(toplam)     -> çalışma zamanı hatası: 'toplam' tanımlı değil
toplam = 0          # önce bağlanır
print(toplam)       # 0

Bellek gözü modelinde ise değişken için yer ayrılmıştır ve o yerde bir bit örüntüsü zaten vardır. Dil, ayrılan alanı sıfırlamıyorsa, okunan değer önceki kullanımdan kalan anlamsız bir örüntüdür. Program çöker de çökmeyebilir de; her çalıştırmada farklı sonuç verebilir.

İkinci durumun tehlikesi, hatanın belirtisiz olmasıdır. Bu yüzden bu modeli kullanan diller ya ilk değer vermeyi zorunlu kılar, ya derleyici uyarısı üretir, ya da ayrılan alanı otomatik sıfırlar.

Genel kural her iki modelde de aynıdır: bir değişken, kullanılmadan önce anlamlı bir değere bağlanır. İlk değer atamasını bildirimle aynı satıra koymak, bu kuralı görünür kılar.

Adlandırma

Adlar dilin kurallarına ve ekibin sözleşmelerine uyar.

Kurallar dile aittir ve zorunludur: hangi karakterlerle başlanabileceği, büyük–küçük harf ayrımının olup olmadığı, hangi sözcüklerin ayrılmış olduğu. if veya while gibi anahtar sözcükler değişken adı olarak kullanılamaz.

Sözleşmeler ekibe aittir ve okunabilirlik içindir:

  • Ad, değişkenin ne tuttuğunu söyler: toplam, olcum_sayisi, en_buyuk.
  • Tek harfli adlar yalnızca dar ve alışılmış bağlamlarda kullanılır (döngü sayacı gibi).
  • Kısaltma, okuyucunun bildiği varsayılamayacak biçimdeyse açılır.
  • Bir projede tek bir yazım düzeni kullanılır; aynı kavram iki farklı adla anılmaz.

Ad seçimi süs değildir. Kodun okunma sayısı yazılma sayısından fazladır; adlar, kodu her okuyanın harcadığı çabayı belirler. Yazılım tasarımı müfredatında bu konu temiz kod başlığı altında ayrıntılandırılır.

Sabitler

Bazı adlar programın çalışması boyunca aynı değere bağlı kalmalıdır: bir dönüşüm katsayısı, bir üst sınır, bir yapılandırma değeri. Bunlara sabit denir.

Diller bunu iki biçimde ele alır. Kimi diller sabitliği zorlar: sabite yeniden atama derleme hatasıdır. Kimi diller yalnızca sözleşmeye dayanır — ad büyük harflerle yazılır ve değiştirilmemesi beklenir.

OLCUM_SINIRI = 100        # sözleşme gereği sabit sayılır

Sabit kullanmanın yararı, aynı değerin kod içinde birden çok yerde yinelenmesini önlemektir. Değer değiştiğinde tek bir satır güncellenir; kodun içine serpiştirilmiş sayılar aranmaz. İkinci ve daha az fark edilen yararı, ada anlam yüklemesidir: koşulda geçen 100 sayısı okuyucuya hiçbir şey söylemezken, OLCUM_SINIRI adı sınırın neyi temsil ettiğini söyler.

Özet

  • Atama önce sağdaki ifadeyi değerlendirir, sonra sonucu soldaki ada bağlar; eşittir işareti eşitlik değil bağlama anlamındadır.
  • Diller değişkeni iki biçimde modeller: adlandırılmış bellek gözü veya nesneye takılmış etiket.
  • Aynı nesneye birden çok ad bağlanabilir; is kimliği, == içerik eşitliğini sınar.
  • Yeniden bağlama sırası önemlidir; takas için geçici bir ad veya çoklu atama gerekir.
  • Adlandırma kuralları dile, sözleşmeler ekibe aittir; ad değişkenin ne tuttuğunu söylemelidir.
  • Sabitler, yinelenen değerleri tek bir noktada toplar.

Sonraki Adım

Bu derste adlara sayılar ve listeler bağlandı; ikisinin farklı davrandığı görüldü. Peki bir değerin türü tam olarak neyi belirler ve kaç tür vardır? Sonraki ders, temel veri tiplerini ve her birinin hangi işlemleri desteklediğini ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat