Python Farklı Düşünür: Kodunuzun İçinde Gerçekte Neler Oluyor? (Görsel Rehber)

İçindekiler
Durun ve bu yazıyı geçmeden önce kendinize şu soruyu sorun: Python'da x = 10 yazdığınızda arka planda tam olarak ne gerçekleşiyor? Eğer cevabınız "Python, 10 sayısını x adındaki bir kutunun içine koyar" ise yanılıyorsunuz. Başlangıç seviyesindeki yazılımcıların karşılaştığı kafa karıştırıcı hataların %90'ının arkasında bu hatalı zihinsel model yatar. CPython kaynak kodlarını incelediğimizde ve uçbirimde deneyler yaptığımızda gördüğümüz gerçekler, Python ile kod yazma yaklaşımımızı baştan aşağı değiştirir. Gelin, Python'ın kodunuzla gerçekte ne yaptığına dair perdeyi aralayalım.
Değişkenler Hakkında Size Söylenen En Büyük Yalan
Neredeyse tüm başlangıç rehberleri aynı şekilde başlar: "Değişkenler kutular gibidir, değerleri içlerine koyarsınız." Kulağa mantıklı gelse de bu yaklaşım Python için tamamen yanlıştır. Python'da değişkenler kutu değil, isim etiketleridir (name tags).
x = 10 yazdığınızda Python, 10 sayısını x isimli bir kutuya hapsetmez. Bunun yerine bellekte bir tamsayı nesnesi (10) üretir ve üzerine x etiketini yapıştırır. Bunu havalimanındaki bagaj etiketleri gibi düşünebilirsiniz: Etiket bavulun kendisini taşımaz; sadece hangi bavulu alacağınızı gösterir.
Bunu kodla kanıtlayalım:
x = 10
y = x
print(id(x)) # 140712834816848
print(id(y)) # 140712834816848 - AYNI adres!
print(x is y) # True
y = x ataması değeri kopyalamaz; yalnızca aynı nesneye ikinci bir etiket yapıştırır. Bu mantık kavrandığında Python'ın tüm çalışma prensibi netleşir.
Python'da Her Şey Bir Nesnedir (Cidden, Her Şey)
Python'da 42 sayısı bellekte rastgele duran ham bir değer değildir. Şu dört temel bileşene sahip eksiksiz bir nesnedir:
- Tip (Type):
int - Değer (Value):
42 - Referans Sayacı (Reference count): Kaç etiketin bu nesneyi işaret ettiği
- Bellek Kimliği (id): Nesnenin bellekteki fiziksel adresi
x = 42
print(type(x)) # <class 'int'>
print(x.__class__) # <class 'int'>
print(isinstance(x, object)) # True
# Fonksiyonlar bile birer nesnedir!
def greet():
return "Hello"
print(type(greet)) # <class 'function'>
print(greet.__class__) # <class 'function'>
print(isinstance(greet, object)) # True
Fonksiyonlar, sınıflar, modüller ve hatta None bile nesnedir. Her şey heap bellekte bir nesne olarak var olur.
Hızlı bir soru: print(type(type)) ne yazdırır?
Cevap: <class 'type'>. Yani type'ın tipi yine type'tır. Python, tip sistemini bu özyinelemeli temel üzerine inşa eder.
Değiştirilebilir (Mutable) ve Değiştirilemez (Immutable): Hata Fabrikası
Geliştiricilerin saatlerce hata ayıklamak zorunda kaldığı kritik ayrım burasıdır:
- Değiştirilemez (Immutable) Nesneler (
int,str,tuple,frozenset): Değiştirilemez bir nesneyi "güncellediğinizde" Python orijinali değiştirmez; yepyeni bir nesne oluşturup etiketi ona yönlendirir.
x = 10
print(id(x)) # 140712834816848
x = x + 1
print(id(x)) # 140712834816880 - FARKLI adres!
Görüldüğü üzere id değişti. Python yeni bir nesne (11) yarattı ve x etiketini ona bağladı; eski nesne (10) dokunulmadan kaldı.
- Değiştirilebilir (Mutable) Nesneler (
list,dict,set): Bu nesneler doğrudan yerinde (in-place) değiştirilebilir. Aynı bellek adresini paylaşan diğer tüm referanslar bu değişimden etkilenir.
Pratik Çıkarım: Değişkenleri "kutu" yerine "etiket" olarak modellemek, özellikle fonksiyonlara argüman aktarırken veya liste kopyalarken beklenmeyen yan etkileri (side-effects) önlemenin en temel kuralıdır.
Bu konuyu daha derinlemesine öğrenmek ister misin?
Edumints'teki ücretsiz kursları incele ve bugün başla.
Kurslara Göz At →