Son zamanlarda Python ile oynamaya başladım ve kapakların çalışma biçimine özgü bir şey ortaya çıktı. 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)
Tek bir girdi alan ve bir sayı tarafından eklenen girdiyi döndüren basit bir işlev dizisi oluşturur. İşlevler for, yineleyicinin ila iarasında çalıştığı döngüde 0oluşturulur 3. Bu sayıların her biri için onu lambdayakalayan ive işlevin girişine ekleyen bir işlev oluşturulur . Son satır ikinci lambdafonksiyonu 3parametre olarak çağırır . Benim için sürpriz çıktı 6.
Beklediğim bir 4. Benim mantığım şuydu: Python'da her şey bir nesnedir ve bu nedenle her değişken onun için bir göstergedir. İçin lambdakapanışları oluştururken i, şu anda işaret ettiği tamsayı nesnesine bir işaretçi saklamasını bekledim i. Bu, iyeni bir tamsayı nesnesi atandığında, önceden oluşturulan kapanmaları etkilememesi gerektiği anlamına gelir . Ne yazık ki, addersdiziyi bir hata ayıklayıcı içinde incelemek, bunu yaptığını gösterir. Tüm lambdafonksiyonlar son değerine bakın i, 3içinde, hangi sonuçların adders[1](3)dönen 6.
Hangi beni merak ediyorsun:
- Kapaklar tam olarak ne yakalar?
lambdaİşlevleri , değerini değiştirdiğindeietkilenmeyecek şekilde , geçerli değerini yakalamaya ikna etmenin en zarif yolu nediri?
i?
print ibunun döngüden sonra işe yaramayacağını söyleyecektim . Ama bunu kendim için test ettim ve şimdi ne demek istediğini anlıyorum - işe yarıyor. Ben döngü değişkenleri python döngü gövdeden sonra kalan hiçbir fikrim yoktu.
if, with, tryvb