SORU
15 Temmuz 2009, ÇARŞAMBA


&; Az Şaşkınlık " " Python: Değişken Varsayılan Argüman

Herkes yeterince Python ile müdahalesi ısırılan (veya parça parça) şu sorundan olmuştur:

def foo(a=[]):
    a.append(5)
    return a

Bu işlev her zaman tek elemanlı bir liste dönmek için beklediğiniz Python acemiler: [5]. Sonuç çok farklı ve çok şaşırtıcı (bir acemi için) yerine:

>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()

Onun ilk bu özelliği ile karşılaştı ve onu aramıştı bir kere benim bir yöneticisi, "dramatik bir tasarım kusuru" dil. Bu davranış, temel bir açıklaması vardı, ve eğer iç anlamıyorsun bile gerçekten çok şaşırtıcı ve beklenmedik olduğunu yanıtladı. Ancak, (kendi kendime) şu soruya cevap vermek mümkün değildi: fonksiyonu yürütme fonksiyonu tanım varsayılan bağımsız değişken bağlama için değil, nedeni nedir? Deneyimli davranışı bir pratik kullanımı (gerçekten rahatsız ediyor ıslah olmadan C statik değişkenler kim kullandı,?) sanmıyorum

Edit:

Baczek ilginç bir örnek. Birlikte senin yorumların çoğu ve özellikle Utaal ile daha fazla detaylandırılmış:

>>> def a():
...     print "a executed"
...     return []
... 
>>>            
>>> def b(x=a()):
...     x.append(5)
...     print x
... 
a executed
>>> b()
[5]
>>> b()
[5, 5]

Benim için tasarım parametreleri karar kapsamında nereye göre olduğu görülüyor: fonksiyonun içinde ya da "birlikte"?

İşin içinde bağlama işlevi anlamına x etkili bağlı olduğu belirtilen varsayılan işlev çağrıldığında, tanımlanmamış bir şey ki bugünkü derin bir kusuru vardır: def hattı olurdu "melez" öyle bir parçası bağlama (fonksiyon nesne) olacağını tanımı ve Bölümü (atama varsayılan parametreler) fonksiyon çağırma zamanı.

Gerçek davranışı daha tutarlıdır: bu hat her şey o satırı çalıştırıldığında, işlev tanımı anlam değerlendirmeye alır.

CEVAP
17 Temmuz 2009, Cuma


Aslında, bu tasarım hatası değil, ve iç, ya da performans nedeniyle değil.< / ^ br . Sadece Python fonksiyonları birinci sınıf nesneler, ve sadece bir kod parçası olmasından kaynaklanıyor.

En kısa sürede almanız için sanırım bu şekilde daha sonra tamamen mantıklı: bir işlev bir nesne olmak değerlendirilmekte tanımı; varsayılan parametreler, bir tür "üye veri" ve bu nedenle onların durumu değiştirilebilir bir çağrı diğer - tam olarak herhangi bir diğer nesne.

Her durumda, Effbot Default Parameter Values in Python Bu davranışının sebeplerini çok güzel bir açıklaması var.< / ^ br . Çok açık buldum, ve ben gerçekten işlev nesneleri nasıl çalıştığını daha iyi bir bilgi için okuma öneririz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • mist64

    mist64

    30 Mayıs 2006
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010

İLGİLİ SORU / CEVAPLAR