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 i
arasında çalıştığı döngüde 0
oluşturulur 3
. Bu sayıların her biri için onu lambda
yakalayan i
ve işlevin girişine ekleyen bir işlev oluşturulur . Son satır ikinci lambda
fonksiyonu 3
parametre 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 lambda
kapanışları oluştururken i
, şu anda işaret ettiği tamsayı nesnesine bir işaretçi saklamasını bekledim i
. Bu, i
yeni bir tamsayı nesnesi atandığında, önceden oluşturulan kapanmaları etkilememesi gerektiği anlamına gelir . Ne yazık ki, adders
diziyi bir hata ayıklayıcı içinde incelemek, bunu yaptığını gösterir. Tüm lambda
fonksiyonlar son değerine bakın i
, 3
iç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ğindei
etkilenmeyecek şekilde , geçerli değerini yakalamaya ikna etmenin en zarif yolu nediri
?
i
?
print i
bunun 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
, try
vb