我对以下代码有疑问。
请原谅我,我是python
新手。
以下代码在我的dodo.py
中:
def closed_over(par):
print("\n??? " + par)
if par == "bar":
return False
else:
return True
def task_bug():
for par in ("foo", "bar"):
print("par: " + par)
# closure!
exist_fn = lambda: closed_over(par)
print(exist_fn)
yield {
"name": par,
"actions": [["echo", "action:", par]],
"verbosity": 2,
"uptodate": [exist_fn]
}
[当我运行doit bug:foo
时,我希望不执行它(closed_over
返回True
),但是:
par: foo
<function task_bug.<locals>.<lambda> at 0x7f8926f9a560>
par: bar
<function task_bug.<locals>.<lambda> at 0x7f8926f9a5f0>
??? bar <- par should be foo
. bug:foo
action: foo <- echo was called
如您所见,yield
之外的两个闭包是不同的函数对象,但由于某些原因,uptodate
总是调用相同的对象。
您的问题与python闭包作用域有关(它的作用域变量不是值)...与doit
无关。关于堆栈溢出,这里可能有很多问题:)
您可以在yield之外看到两个闭包,它们是不同的函数对象,但是由于某些原因,uptodate总是调用相同的对象。
不,它没有调用相同的闭包。问题是与参数相同的变量。]>
事实证明,我认为python
具有动态范围,而实际上却进行了词法作用域。