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
功能。这是一个相当粗糙的方法,但它非常简短和方便