Python sözlü kilitler
Javascript kodu içinde sözlü kapanışları ile yaşadığım bir sorun araştırırken ... ... birlikte Python ile bu problem geldim:
flist = []
for i in xrange(3):
def func(x): return x * i
flist.append(func)
for f in flist:
print f(2)
Bu örnek, düşünceli bir şekilde lambda
önler unutmayın. Yazdırır "4 4 4 şaşırtıcı.", Beklerdim "0 2 4".
Bu eşdeğer Perl kodu mu değil mi:
my @flist = ();
foreach my $i (0 .. 2)
{
push(@flist, sub {$i * $_[0]});
}
foreach my $f (@flist)
{
print $f->(2), "\n";
}
"0 2 4" yazdırılır.
Aradaki farkı açıklar mısınız lütfen ?
< / ^ hr .
Güncelleme:
Sorundeğili
global olmak. Bu aynı davranışı gösterir:
flist = []
def outer():
for i in xrange(3):
def inner(x): return x * i
flist.append(inner)
outer()
#~ print i # commented because it causes an error
for f in flist:
print f(2)
Açıklamalı olarak çizgi gösterir, i
Bu noktada bilinmiyor. Yine de, bu baskılar "4 4 4".
CEVAP
Aslında Python olarak tanımlanan davranıyor.Üç ayrı işlevlerioluşturulur, ama onlar her vartanımlanmış onlar çevrenin kapatılması- bu durumda, küresel çevre (veya eğer döngü başka bir işlev içinde yerleştirilir dış işlev ortamı). Bu sorun tam olarak bu, ama bu ortamdamutasyona uğramışve kilitleraynı ben bakın.
Burada ile geldi - bir işlev yaratıcısı oluşturmak ve çağırmak için yapabileceğim en iyi çözüm . ben^>buyerine. Bu zorlarfarklı ortamlarbir işlevleri ile oluşturulan her biri için,ben farklıher birine.
flist = []
for i in xrange(3):
def funcC(j):
def func(x): return x * j
return func
flist.append(funcC(i))
for f in flist:
print f(2)
Bu yan etkiler ve fonksiyonel programlama karışımı bir şey.
Kilitler Python ile ilgili olarak açık...
Bu GİL yüzünden bir çok iş parçacıklı ...
Nasıl Python dizin tarafından bir list...
Nasıl Python modülü kaynaklarının yeri...
Çoklu iş parçacığı havuzu Havuza benze...