SORU
19 ŞUBAT 2010, Cuma


(Lambda) kapatma Python yakalama işlevi ne?

Son zamanlarda etrafta bir şekilde garip geldim Python kilitler çalışma ile oynamaya başladım. Aşağıdaki kodu göz önünde bulundurun:

adders= [0,1,2,3]
for i in [0,1,2,3]:
   adders[i]=lambda a: i a

print adders[1](3)

Giriş bir numara tarafından eklenen tek giriş ve Geri Al işlevleri, basit bir dizi oluşturur. Fonksiyonları yineleyici nerede döngü için inşa edilmişben0 3 çalışır. Bu sayının her biri için lambda fonksiyonlar olan yakalar oluşturulurbenve ekler işlevi giriş için. Son satırı parametre olarak 3 ile ikinci lambda işlevi çağırır. Benim için sürpriz çıktı:

6

4 bekliyordum. Benim akıl: Python her şeyi ve böylece her değişken gerekli bir nesne için bir işaretçi. Lambda oluşturmak için kilitlerben, Tamsayı nesnesi için bir işaretçi depolamak için bekliyordum tarafından gösteriyordu şu andaben. O zaman anlamına gelirbenyeni tamsayı nesnesi atanmış önceden oluşturulmuş kapatma etkisi olmamalı. Ne yazık ki, bir hata ayıklayıcı içinde engerekleri dizi inceleme yapar gösterir. Tüm lambda fonksiyonları son değerine bakınbenAdders1 dönen 6 sonuç , 3,.

Aşağıdaki gibidir:

  • bu kapaklar tam olarak ne yakalamak nedir?
  • Ne lambda geçerli değerini yakalamak için işlev gören ikna etmenin en zarif yolubenve bir şekilde etkilenmezbendeğerini değiştirir.

CEVAP
19 ŞUBAT 2010, Cuma


bir değişkenin varsayılan değeri bir değişken kullanarak çekme kuvveti:

>>> for i in [0,1,2,3]:
...    adders[i]=lambda a,i=i: i a  # note the dummy parameter with a default value
...
>>> print( adders[1](3) )
4

fikri bir parametre (akıllıca i adlı ilan ve yakalamak istediğiniz değişkenin varsayılan değeri (i değeri) vermektir

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 365multimedia

    365multimedi

    26 ŞUBAT 2009
  • Living Waters

    Living Water

    9 AĞUSTOS 2006
  • USI Events

    USI Events

    6 AĞUSTOS 2013