python中的嵌套范围

时间:2014-08-14 18:59:28

标签: python lambda scope

我的问题是关于封闭范围的规则。在下面的代码段中,如果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))

1 个答案:

答案 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?