以下testing失败: #!/usr/bin/env python def f(*args): """ >>> t = 1, -1 >>> f(*map(lambda i: lambda: i, t)) [1, -1] >>> f(*(lambda: i for i in t)) # -> [-1, -1] [1, -1] >>> f(*[lambda: i for i in t]) # -> [-1, -1] [1, -1] """ alist = [a() for a in args] print(alist) if […]
闭包是一个令人难以置信的有用的语言function。 他们让我们做聪明的事情,否则会占用大量的代码,并且经常使我们能够编写更优雅更清晰的代码。 在Python 2.x中,闭包variables名称不能被反弹; 也就是说,在另一个词法范围内定义的函数不能像some_var = 'changed!'那样做some_var = 'changed!' 对于局部范围以外的variables。 有人可以解释为什么吗? 有些情况下,我想创build一个闭包,重新绑定外部variables的variables,但这是不可能的。 我认识到几乎在所有情况下(如果不是全部),这种行为可以通过类来实现,但是通常不是那么干净或者优雅。 为什么我不能用闭包来实现呢? 这是一个重新绑定closures的例子: def counter(): count = 0 def c(): count += 1 return count return c 这是您调用它时的当前行为: >>> c() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in c UnboundLocalError: local variable 'count' referenced before […]
当我调查Javascript代码中的词法closures的问题时,我在Python中遇到了这个问题: flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2) 请注意,这个例子很好的避免了lambda 。 它打印“4 4 4”,这是令人惊讶的。 我期望“0 2 4”。 这个等价的Perl代码是正确的: my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print $f->(2), "\n"; […]