lambda

2012-10-11 8 views
6

Bu örneği ele alalımlambda

def dump(value): 
    print value 

items = []  
for i in range(0, 2): 
    items.append(lambda: dump(i)) 

for item in items: 
    item() 

çıkışı:

1 
1 

nasıl alabilirim:

0 
1 

cevap

5

Üzerinde varsayılan bir değere sahip bir parametresini kullanabilirsiniz lambda:

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

Bu, varsayılan değer, işlev tanımlandığında değil, çağrıldığında, değerlendirildiği için çalışır.

for i in range(0, 2): 
    items.append(lambda i=i: dump(i)) 

i

varsayılan parametre değerleri fonksiyon oluşturma sırasında değerlendirilir çünkü bu işler

mevcut değerini yakalamak için, ve i harici değişken, ancak bir işlev değil:

+0

adam, akıllı. Bu örnekydi ama geçici bir çözüm buldunuz, bu noktada lambda tanımıyla ilgili referansın nasıl değerlendirileceği ele alındı. Bunu yapmanın bir yolu var mı? – bradojevic

4

kullanabilirsiniz Varsayılan olarak istediğiniz değere sahip olacak parametre.

Daha ayrıntılı bir açıklama bu answer bulunabilir.

0

Çıktı değeri, bildirimde değil, işlev değerlendirmesinde i değeridir. Bu yüzden istenen sonucu almıyorsunuz.

1

tamlığı için, ayrıca yapabilirsiniz:

for i in range(0, 2): 
    items.append((lambda i: lambda: dump(i))(i)) 
+0

Bu cevabın, varsayılan değer yanıtından daha ayrıntılı olmasına rağmen, en az hacky olduğunu hissediyorum. – max