python-3.x - 如何在 Python 闭包中捕获值
问题描述
如何在 python 闭包中捕获一个值(而不是引用)?
我试过的:
这是一个创建无参数函数列表的函数,每个函数都输出一个字符串:
def makeListOfFuncs( strings):
list = []
for str in strings:
def echo():
return str
list.append( echo)
return list
如果 python 中的闭包像其他所有语言一样工作,我希望这样的调用:
for animalFunc in makeListOfFuncs( ['bird', 'fish', 'zebra']):
print( animalFunc())
...会产生这样的输出:
bird
fish
zebra
但是在 python 中,我们得到:
zebra
zebra
zebra
显然正在发生的事情是echo
函数的闭包正在捕获对 str 的引用,而不是在闭包构造时调用框架中的值。
如何定义 makeListOfFuncs,以便得到“鸟”、“鱼”、“斑马”?
解决方案
我在Bob Kerner的博客文章中找到了答案。
def makeListOfFuncs( strings):
list = []
for str in strings:
def generateFunc( str):
def echo():
return str
return echo
list.append( generateFunc( str))
return list
for animalFunc in makeListOfFuncs( ['bird', 'fish', 'zebra']):
print( animalFunc())
Python 闭包很奇怪。