2011-06-22 22 views
28

Olası Çoğalt:
“Least Astonishment” in Python: The Mutable Default ArgumentOpsiyonel Python fonksiyonları parametreleri ve standart değerleri

ben tür karıştı Python işlevleri/yöntemleri nasıl çalıştığını isteğe bağlı parametreler üzereyim.

Aşağıdaki kod bloğunu var:

>>> def F(a, b=[]): 
...  b.append(a) 
...  return b 
... 
>>> F(0) 
[0] 
>>> F(1) 
[0, 1] 
>>> 

Neden F(1) döner [0, 1] değil [1]?

içinde neler oluyor?

+0

: varsayılan bir listesini almak (veya sözlüğünü veya set) doğru yolu işlevi içinde yerine çalışma zamanında oluşturmak olduğundan listeye :) – sam

cevap

38

PyCon'dan bir kaç yıl önce iyi bir doktor - Default parameter values explained. Fakat temel olarak, listeler değişken nesneler olduğundan ve anahtar kelime argümanları işlev tanımlama zamanında değerlendirildiğinden, işlevi her aradığınızda aynı varsayılan değeri alırsınız.

bu olurdu yapmak doğru yol:

def F(a, b=None): 
    if b is None: 
     b = [] 
    b.append(a) 
    return b 
8

Default parameters biraz fonksiyon nesne üzerinde üye değişkenleri gibi, oldukça sezgisel vardır.

Varsayılan parametre değerleri, işlev tanımı yürütüldüğünde değerlendirilir. Bu, ifadenin, işlev tanımlandığında bir kez değerlendirildiği ve her bir çağrı için aynı "önceden hesaplanmış" değerin kullanıldığı anlamına gelir. Bu, özellikle bir varsayılan parametrenin bir liste veya sözlük gibi değişebilir bir nesne olduğunu anlamak için önemlidir: işlev nesneyi değiştirirse (ör. Bir öğeye bir listeyi ekleyerek), varsayılan değer değiştirilir.

http://docs.python.org/reference/compound_stmts.html#function

Listeleri kesilebilir amaçları; içeriğini değiştirebilirsin. Sadece eklemeden önce b değerini yazdırarak kolayca görebiliriz

def good_append(new_item, a_list=None): 
    if a_list is None: 
     a_list = [] 
    a_list.append(new_item) 
    return a_list