2011-04-19 14 views
24

İşte bir işlev. Amacım, sağlanmamışsa sözlükte boş bir sözlük oluşturmak için anahtar kelime argümanı varsayılanlarını kullanmaktır.python fonksiyonunda anahtar kelime argümanı için varsayılan değer olarak boş sözlük: Sözlük sonraki çağrılarda {} için başlatılmamış gibi görünüyor mu?

>>> def f(i, d={}, x=3) : 
...  d[i] = i*i 
...  x += i 
...  return x, d 
... 
>>> f(2) 
(5, {2: 4}) 

Ama sonraki çağrı f, ben aldığımda:

>>> f(3) 
(6, {2: 4, 3: 9}) 

Boş bir sözlüğe göstermiyor ikinci aramada anahtar kelime argüman d benziyor ama daha ziyade bunun yanı sözlüğe önceki aramanın sonunda bırakıldı. Her çağrıda x sayısı sıfırlanır.

Şimdi bu konu üzerinde çalışabilirim, ancak yardımınızı anlamanızı istiyorum. Anahtar kelime argümanlarının işlevin yerel kapsamına olduğuna inandım ve işlev döndükten sonra silinecek. (Kusurluysam ve terminolojimi düzelttiysem.)

Yani d ile işaret edilen yerel değer silinmeli ve bir sonraki çağrıda anahtar kelime argümanını d sağlamazsam d default {}'a ayarlanmalıdır. Fakat görebildiğiniz gibi d, önceki çağrıda işaret edilen sözlükte ayarlanmaktadır.

Neler oluyor?

literal {}, kapsam kapsamındaki def satırında mı?

Bu davranış 2,5, 2.6 ve 3.1'de görülmektedir.

+1

: [fonksiyon/metot bağımsız değişkenler için Değişken varsayılan] (http://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/) –

cevap

2
>>> def f(i, d=None, x=3): 
...  if not d: 
...   d={} 
...  d[i] = i*i 
...  x += i 
...  return x,d 
... 
>>> f(2) 
(5, {2: 4}) 
>>> f(3) 
(6, {3: 9}) 
>>> 
tipik piton gotcha olan
+1

biz d olarak tanımlayabilir = d veya {}. –