Python 将值传递给闭包

Python 将值传递给闭包,python,python-2.7,function,closures,Python,Python 2.7,Function,Closures,假设我们有以下情况: list names = ['foo','bar','derp','herp'] def outer_func(): funcs = [] for name in names: def inner_func(): print(name) funcs.append(inner_func) return funcs result_funcs = outer_func() result_funcs[0]() # thi

假设我们有以下情况:

list names = ['foo','bar','derp','herp']
def outer_func():
   funcs = []
   for name in names:
      def inner_func():
         print(name)
      funcs.append(inner_func)
   return funcs

result_funcs = outer_func()
result_funcs[0]() # this will print 'herp'
我进行了一些调试,发现闭包包含对name的引用 所以我试着这样做:

...
for name in names:
   cpy = copy.copy(name)
   def inner_func()
      print cpy
...
result_funcs[0]() # this will still print 'herp'
但这仍然印着“herp”


python似乎持有一个指向外部作用域中变量的指针,该变量指向实际值 (就像指向指针的指针)

我最终想要的是为每个内部函数创建,以在迭代过程中保存name的值

有人能解释一下我错在哪里,我怎样才能实现我的目标吗


谢谢大家!

正如您所猜测的那样,
name
的计算是惰性的

通过将
name
定义为参数的默认值(未使用),可以强制绑定
name

有几种方法可以做到这一点,其中一种非常简单:如下所示:

  def inner_func(n=name):
     print(n)

现在它将打印“foo”

更正您的代码。这是有缺陷的,“python似乎持有一个指向外部作用域中变量的指针,该指针指向实际值(就像指向指针的指针)”。不完全是。列表中存储的每个函数仅在运行时解析名称
name
。IMHO,从指针和从C数据模型派生的其他术语来考虑Python的数据模型很少有成效。相反,试着用它自己的术语来理解它,如和.FWIW中所述,您可以使用
[lambda n=name:print(n)for name in names]
轻松创建函数列表,尽管在Python 2中,您需要在脚本开始时(在任何其他导入之前)使用
from\uuuuuuuuuu future\uuuuuuuuuuu import print\u函数启用
print
功能。这是一个相当粗糙的方法,但它非常简短和方便