作用域与带有循环变量的默认参数相比较问题

Posted 断桥烟雨旧人伤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作用域与带有循环变量的默认参数相比较问题相关的知识,希望对你有一定的参考价值。

这个问题是来自于美国作家鲁特兹(Mark Lutz)所作的一本《Learning Python,Fourth Edition》书里提及到的。

原文如下:

如果 lambda 或者 def 在函数中定义,嵌套在一个循环之中,并且嵌套的函数引用了一个上层作用域的变量,该变量被循环变量所改变,所有在这个循环变量中产生的函数将会有相同的值——在最后一次循环中完成时被引用变量的值。

我们来看下一个例子:

>>> def makeActions():
...     acts = []
...     for i in range(5):
...             acts.append(lambda x: i ** x)
...     return acts
... 
>>> acts = makeActions()
>>> acts[0](2)
16
>>> acts[1](2)
16
>>> acts[2](2)
16
>>> acts[3](2)
16
>>> acts[4](2)
16

 另一个例子:

>>> def makeActions():
...     acts = []
...     for i in range(5):
...             acts.append(lambda x, i = i: i ** x)
...     return acts
... 
>>> acts = makeActions()
>>> acts[0](2)
0
>>> acts[1](2)
1
>>> acts[2](2)
4
>>> acts[3](2)
9
>>> acts[4](2)
16

具体还待考究

以上是关于作用域与带有循环变量的默认参数相比较问题的主要内容,如果未能解决你的问题,请参考以下文章

js的作用域与作用域链

作用域与闭包

作用域与闭包

YDKJS:作用域与闭包

JS你不知道的JavaScript 笔记—— 作用域与闭包 - 编译原理 - LHS - RHS - 循环与闭包 - 模块 - 词法作用域 - 动态作用域

作用域与变量提升的面试题方法总结