假设我们有以下情况:
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的值。
有人可以向我解释我在哪里错了,我怎样才能实现目标?
谢谢!
答案 0 :(得分:2)
name
会被懒惰地评估。
您可以通过将name
定义为参数的默认值(您未使用)来强制绑定name
有几种方法可以做到,一个很简单:像这样:
def inner_func(n=name):
print(n)
现在打印"foo"