最近我开始玩Python,我遇到了一些特殊的闭包方式。请考虑以下代码:
adders=[0,1,2,3]for i in [0,1,2,3]: adders[i]=lambda a: i+aprint adders[1](3)
它构建了一个简单的函数数组,它接受单个输入并返回由数字添加的输入。函数在for
循环中构造,迭代器i
从中循环0
到3
。对于这些数字中的每一个,lambda
都会创建一个函数i
,该函数捕获并将其添加到函数的输入中。最后一行将第二个lambda
函数3
作为参数调用。令我惊讶的是输出结果是6
。
我期待一个4
。我的理由是:在Python中,一切都是一个对象,因此每个变量都是指向它的指针。在创建lambda
闭包时i
,我希望它存储一个指向当前指向的整数对象的指针i
。这意味着当i
分配一个新的整数对象时,它不应该影响先前创建的闭包。遗憾的是,adders
在调试器中检查数组表明它确实存在。所有的lambda
功能指的最后一个值i
,3
,这将导致adders[1](3)
返回6
。
这让我想知道以下内容:
闭包捕获的内容是什么?
什么是最优雅的方式来说服lambda
函数以更改其值i
时不会受到影响的方式捕获当前i
值?
慕后森
慕斯王
qq_笑_17
慕运维8079593