当深入研究词法闭包的复杂性时,Python 代码中的特殊行为变得显而易见。考虑以下示例:
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
令我们惊讶的是,此代码打印“4 4 4”而不是预期的“0 2 4”。这种意外的行为源于 Python 处理词法闭包的方式。
与 Perl 不同,Perl 为每次迭代创建一个新的闭包,Python 创建三个独立的函数。然而,每个函数都保留了定义它的环境的闭包,即全局环境。这种共享闭包会导致每个函数都引用相同的可变变量 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)
此修改后的代码纠正了问题,展示了 Python 的方式之间微妙但显着的差异和 Perl 处理词法闭包。通过了解所使用的特定编程语言的闭包行为,开发人员可以避免此类意外结果并编写更健壮和可预测的代码。
以上是为什么 Python 的闭包行为会在嵌套循环中产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!