奇怪的是,这不是一个变量范围问题,而是python for for循环(和python变量)语义的问题.
正如您所期望的那样,我在lambda中正确地引用了最近的封闭范围中的变量i.到现在为止还挺好.
但是,您希望这意味着发生以下情况:
for each value in the list ['a', 'b', 'c', 'd']:
instantiate a new variable, i, pointing to the current list member
instantiate a new anonymous function, which returns i
append this function to cons
实际发生的是:
instantiate a new variable i
for each value in the list ['a', 'b', 'c', 'd']:
make i refer to the current list member
instantiate a new anonymous function, which returns i
append this function to cons
因此,您的代码将相同的变量i附加到列表中四次 – 并且在循环退出时,我的值为“d”.
请注意,如果python函数按值获取并返回其参数/返回值的值,您将不会注意到这一点,因为i的内容将在每次调用时被复制(或者,就此而言,在每次返回时都会复制)用lambda创建的匿名函数.但实际上,python变量总是引用一个特定的对象 – 因此你的四个副本都是在循环结束时引用’d’.