(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
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
İşlevi'Python adı s ile bir dized...
Bir arasındaki fark 'kapatma'...
Bir nesnenin mevcut tüm özelliklerini ...
Python shell komutu çalıştırma ve çıkı...
Zarif Python CamelCase camel_case dönü...