通过值传递到关闭

时间:2017-08-02 07:19:10

标签: 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]() # this will print 'herp'

我调试了一下,发现闭包有名称的引用 所以我试着这样做:

...
for name in names:
   cpy = copy.copy(name)
   def inner_func()
      print cpy
...
result_funcs[0]() # this will still print 'herp'

但是这仍然打印了' herp'

似乎python拥有一个指向外部作用域中指向实际值的变量的指针 (比如指针指针)

我最终想要的是创建的每个内部函数,以便在定义的迭代期间保存name的值。

有人可以向我解释我在哪里错了,我怎样才能实现目标?

谢谢!

1 个答案:

答案 0 :(得分:2)

正如您所猜测的那样,

name会被懒惰地评估。

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

有几种方法可以做到,一个很简单:像这样:

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

现在打印"foo"