<p>正如您所说,它创建闭包,闭包使用的是<em>lambdaString</em>的上限范围中的声明变量,但诀窍是所有lambda都使用相同的ref来<em>lambdaString</em>,因为每次它记住最后一个变量时都会更改它。例如:</p>
<pre><code>c = ['one', 'two']
res = []
for i in range(2):
for y in c:
def la(x):
print(x, y)
res.append(la)
for la in res:
la('Show: ')
# Show: two
# Show: two
# Show: two
# Show: two
</code></pre>
<p>你只需要再关闭一次就可以防止这种情况发生</p>
<pre><code>c = ['one', 'two']
res = []
for i in range(2):
for y in c:
def closure_y(y):
def la(x):
print(x, y)
return la
res.append(closure_y(y))
for la in res:
la('Show: ')
# Show: one
# Show: two
# Show: one
# Show: two
</code></pre>
<p>完整的代码可能是</p>
<pre><code>specification = {
'labelOne': ['labelOne.one', 'labelOne.two', 'labelOne.three', 'labelOne.four', 'labelOne.five'],
'labelTwo': ['labelTwo.one', 'labelTwo.two', 'labelTwo.three', 'labelTwo.four', 'labelTwo.five'],
'labelThree': ['labelThree.one', 'labelThree.two', 'labelThree.three', 'labelThree.four', 'labelThree.five'],
'labelFour': ['labelFour.one', 'labelFour.two', 'labelFour.three', 'labelFour.four', 'labelFour.five'],
'labelFive': ['labelFive.one', 'labelFive.two', 'labelFive.three', 'labelFive.four', 'labelFive.five'],
}
lambdas = []
for label, labelStrings in specification.items():
for labelString in labelStrings:
lambdaString = f"""Label: \"{label}\" with labelString: \"{labelString}\""""
def clousure(lambdaString):
oneArgLambda = lambda someArg: print(someArg, lambdaString)
return oneArgLambda
lambdas.append(clousure(lambdaString))
for each in lambdas:
each('Show: ')
</code></pre>