我的问题是关于封闭范围的规则。在下面的代码段中,如果x = x未传递给F2的标题,则会出现错误
def f1():
x = 88
def f2(x=x): # Remember enclosing scope X with defaults
print(x)
f2()
f1()
然而我不明白为什么" x = x"在以下代码段中的lambda中不需要
def func():
x = 4
action = (lambda n: x ** n) # x remembered from enclosing def
return action
x = func()
print(x(2))
答案 0 :(得分:2)
在下面的代码段中,如果x = x未传递给F2的标题,则会出现错误
不,不会:
>>> def f1():
... x = 88
... def f2():
... print(x)
... f2()
...
>>> f1()
88
当您尝试传递稍后可能更改的值时,您只需要默认参数值hack。 f2
正如我所写,它从封闭范围中捕获变量x
,因此它将打印当时恰好是x
的内容。在您编写它时,它会捕获变量x
的当前值,而不是变量本身。
例如:
>>> def f1():
... x = 88
... def f2():
... print(x)
... x = 44
... f2()
...
>>> f1()
44
>>> def f1():
... x = 88
... def f2(x=x):
... print(x)
... x = 44
... f2()
...
>>> f1()
88
有关此差异很重要的一个非常常见的现实示例,请参阅官方常见问题解答中的Why do lambdas defined in a loop with different values all return the same result?。