SORU
24 EKİM 2008, Cuma


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
24 EKİM 2008, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gimpology.com Video Tutorials

    Gimpology.co

    3 ŞUBAT 2008
  • The Computer Chronicles

    The Computer

    7 Kasım 2012
  • Chaîne de TheMoustic

    Chaîne de T

    5 Kasım 2006