Python'da parametreler 'nesne referansı ile çağrı' (ya da 'paylaşım ile çağrı') prensibine göre geçilir. Bu, fonksiyonun nesnenin kendisini değil, nesneye olan bir referansı aldığı anlamına gelir. Eğer nesne değiştirilebilirse (mutable), fonksiyon içinde içeriği değiştirmek mümkündür ve değişiklikler dışardaki değişkene yansır. Değiştirilemez nesneler (immutable), örneğin sayılar veya stringler, fonksiyon içinde değiştirildiğinde yeni bir nesne oluşturulur; bu, orijinalini etkilemez.
Değiştirilebilir nesne için bir örnek:
def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]
Değiştirilemez nesne için:
def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5
Soru: "Python'da değişkenler fonksiyonlara referansla mı yoksa değerle mi geçilir?"
Cevap: Ne klasik anlamda referans, ne de değer. Değişken, aslında nesneye olan bir referansı geçirir ama kendini değil; ve dışarıdaki değişken için nesneyi değiştirmek mümkün değildir.
Hikaye Bir projede veri ayrıştırma için kullanılan bir fonksiyon, listeyi filtrelemek için tasarlandı. Fonksiyon içinde yeni bir liste oluşturulmadı, filtreleme orijinal liste üzerinde değişiklik yapılarak gerçekleştirildi. Bu durum orijinal verilerin silinmesine neden oldu - birkaç kez script çalıştığında veriler artık yoktu.
Hikaye Juniör geliştirici, stringlerin fonksiyon içinde "referansla" değiştirilebileceğini düşündü çünkü diğer parametreler (listeler) değiştirilebiliyordu. Sonuç olarak, fonksiyon çağrısından sonra program beklenen değişiklikleri alamadı (string değişmedi); bu durum anlam verilemeyen hatalara yol açtı.
Hikaye REST API'de giriş verilerini filtrelemek için geliştirici, parametreler sözlüğünün bir kopyasını yapmakta hata yaptı ve doğrulama sırasında değerler "kayboldu" - parametreler orijinal nesneden silindi ve bu sonrasında gelen isteklerin mantığını bozdu.