首页 > 解决方案 > 如何在 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,以便得到“鸟”、“鱼”、“斑马”?

标签: python-3.xclosures

解决方案


我在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 闭包很奇怪。


推荐阅读