当前位置: 首页 > 面试题库 >

Python-词汇闭包如何工作?

楚意
2023-03-14
问题内容

当我研究Java代码中的词法闭包问题时,我在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";
}

打印“ 0 2 4”。

你能解释一下区别吗?

更新:

这个问题是不是与i是全球性的。这显示相同的行为:

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)

如注释行所示,i在这一点上未知。仍然打印“ 4 4 4”。


问题答案:

实际上,Python的行为符合定义。创建了三个单独的函数,但是每个函数都封闭了定义它们的环境 -在这种情况下,是全局环境(如果将循环放在另一个函数内部,则为外部函数的环境)。不过,这确实是问题所在-在这种环境下,i发生了变异,并且所有闭包都引用相同的i。

这是我能想到的最佳解决方案-创建一个函数创建器,然后调用它。这将为所创建的每个函数强制使用不同的环境,每个函数具有不同的i。

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)

当您混合副作用和功能编程时,就会发生这种情况。



 类似资料:
  • 在标杆规格中,我读到 将 Unicode 字符的原始流中的 Unicode 转义(第 3.3 节)翻译成相应的 Unicode 字符。 \uxxxx 形式的 Unicode 转义,其中 xxxx 是十六进制值,表示编码为 xxxx 的 UTF-16 代码单元。此转换步骤允许任何程序仅使用 ASCII 字符表示。这里 这意味着词汇翻译仅适用于 ASCII 字符?因为当我尝试使用西里尔文,希伯来语或汉

  • 词汇表 本表列出的是一些单词在本书中使用的翻译。这些单词大部分是专业术语,一部分是字典上没有的。 英文 中文 adapter 适配器 algorithm 算法 allocate 分配 allocator 分配器 amortize 分摊 argument 实参 associative container 关联容器 cast 映射 category 种类 component 组件 context 场景

  • 这是 Redux 的核心概念词汇表以及这些核心概念的类型签名。这些类型使用了流标注法进行记录。 State type State = any State (也称为 state tree) 是一个宽泛的概念,但是在 Redux API 中,通常是指一个唯一的 state 值,由 store 管理且由 getState() 方法获得。它表示了 Redux 应用的全部状态,通常为一个多层嵌套的对象。 约

  • @Directive more more @Injectable more @Input more more @Pipe more @ViewChildren more

  • 此词汇表包含了与Apache相关的一些常用术语的详细定义,以及对网络服务的一般说明,并提供了相关的更详细资料的连接。 定义 访问控制(Access Control) 对网络领域访问的限制。对Apache来说,通常是指对某些URL访问的限制。参见:认证、授权、访问控制 算法(Algorithm) 通过有限步骤解决问题的一个明确的公式或者一套规则。用于加密的算法通常称为加密算法(Cipher)。 Ap

  • 这是 React Router 库以及文档中常用术语的词汇表,并附有 type signatures(类型签名),以首字母顺序列出。 Action(动作) Component(组件) EnterHook LeaveHook Location LocationKey LocationState Path(路径) Pathname(路径名) Params(参数) Query QueryString R