ProgramlamaBackend Geliştirici

Python'da fonksiyonlardaki varsayılan argümanlar nasıl çalışır? Değiştirilebilir nesnelerin (örneğin listeler) varsayılan değer olarak kullanılmasının beklenmedik sonuçlara yol açabileceği neden? Ayrıntılı bir örnek verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Python'da varsayılan argümanlar yalnızca bir kez — fonksiyon tanımlandığında — hesaplanır, her çağrıda değil. Bu, varsayılan değer olarak değiştirilebilir bir nesne (örneğin, liste veya sözlük) kullanıldığında, bu nesnenin belirli bir argüman açıkça belirtilmediğinde tüm fonksiyon çağrıları için ortak olacağı anlamına gelir.

Örnek:

def append_item(item, items=[]): items.append(item) return items print(append_item(1)) # [1] print(append_item(2)) # [1, 2], ama [2] beklenirdi

Doğru yol:

def append_item(item, items=None): if items is None: items = [] items.append(item) return items

Artık her çağrı kendi listesini alıyor.

Hileli soru.

Soru: Varsayılan değiştirilebilir nesne ile fonksiyon tekrar tekrar çağrıldığında ne olur?

Cevap: Aynı nesne her seferinde değiştirilir. Yukarıdaki örnek bunu illustre eder — liste tüm değerleri biriktirir.

Konuyla ilgili bilgi eksikliği nedeniyle gerçek hata örnekleri.


Hikaye Büyük bir web uygulamasında veri önbelleklemesi sırasında varsayılan sözlük parametresi olan bir fonksiyon kullanıldı. Bu, farklı kullanıcılar arasında verilerin 'sızmasına' neden oldu: biri profilini değiştirdiğinde — bu değişiklikler bazen başka bir kullanıcıya görünüyordu çünkü global sözlüğün ortak durumu vardı.


Hikaye Testlerde, istatistik toplamak için varsayılan liste olarak değiştirilebilir bir liste olan bir fonksiyon kullanıldı. Bir testin verileri diğerine 'aktı', bu da beklenmedik çöküşlere, hatanın tekrar üretilememesine ve karmaşık hata ayıklamaya neden oldu.


Hikaye Logların toplanması için bir mikroserviste, varsayılan argüman olarak bir listenin olduğu bir fonksiyon ile olaylar biriktirildi. Loglar yinelendi — eski taleplerden geçici birikimler yeni müşterilere ulaştı, bu da saatlerce araştırma ve veri kaybına mal oldu.