python ve call by sharing

Bildiğim kadarıyla python’ı diğer dillerden ayıran bir başka özelliği değişkenlerin fonksiyonlara nasıl yollandığı. Klasik “call by reference” veya “call by value” şeklinde de değil.

Emre Yilmaz
EY devel
3 min readSep 26, 2013

--

Aşağıdaki örnek bir fonksiyonumuz var.

fonksiyon basit. girdi olarak liste alıp, listeye 25 değerinde bir int ekliyor. Hemen fonksiyonu deneyelim:

y’nin global alanda değerinin ne olmasını beklersiniz?

Bu şekilde bakarsak call by reference şeklinde gözüküyor. fonksiyonun içinde değeri değiştirdiğimiz halde genel scope’da baktığımızda da değer değişmiş durumda.

Başka bir deneme yapalım.

Bu sefer baktığımızda fonksiyon scope’u içerisinde x, üzerinde oynanmış değere sahipken, fonksiyon scope’undan çıktığımızda x’ün güncellenmediğini görüyoruz.

Bu fonksiyonu ele alırsak da model, call by value şeklinde gözüküyor?

Python iki modele de sahip değil. Bu durum, call by sharing veya call by object reference şeklinde geçiyor daha çok literatürde.

Python’da her şey — veri tipleri de dahil objedir.

Herhangi bir instantiation(örnekleme?) yapmasak da arkaplanda x bir objeden türetilerek oluşturulur. Bu nesnelerin hepsinin bir referansı olur ve referanslar da basit olarak hafızada hangi objenin nerede tutulduğunu tutar.

İlk yazdığımız fonksiyonu bir daha hatırlayalım:

add_to_list() fonksiyonu çalışmaya başladığında arkaplanda y nesnesinin referansı kopyalanıyor. birden fazla referans aynı nesneyi paylaşıyor.

birinci fonksiyonun analizi.

İki referans da aynı nesneyi paylaştığı için, hangi referanstan olursa olsun bir değişiklik yaptığımız da aynı nesne etkilenecektir.

Peki ikinci fonksiyondaki fark ne? Bakalım.

Bu seferki farkın fonksiyon içinde x’in yeni bir liste nesnesine atanıyor oluşu.

şeklinden farkı yok. Farklı bir nesne, farklı bir referans demek, memory’de farklı bir yer demek.

ikinci fonksiyonun analizi.

immutable (değiştirelemez) objeler

immutable objeler bir kere yaratıldıktan sonra değiştirelemez objelerdir.

yazının başındaki fonksiyonlarda mutable veri tipi olan listeleri kullandık. immutable bir veri tipi kullanırsak senaryo yine değişiyor.

aynı işi listelerle yaptığımızda farklı olan senaryo string kullandığımızda değişti.

immutable değerlerle çalışan fonksiyonun analizi.

Aynı şekilde; iki referans aynı nesneyi (‘kazu’) paylaşsa da nesne immutable olduğu için değiştirilemedi. string, tuple, integer gibi değerler argüman olarak yollandığında — bu objeler özünde iyi ve immutable oldukları için, scope içine başka bir string nesnesi/referans yeni haliyle yerleştiriliyor.

--

--

Emre Yilmaz
EY devel

i develop stuff for the internets. — /irc.freenode.net #brotoss