python中的嵌套作用域

python中的嵌套作用域,python,lambda,scope,Python,Lambda,Scope,我的问题是关于封闭范围的规则。在下面的代码段中,如果x=x未传递到F2的标头,则将出现错误 def f1(): x = 88 def f2(x=x): # Remember enclosing scope X with defaults print(x) f2() f1() 但是我不明白为什么在下面的代码片段中lambda中不需要“x=x” def func(): x = 4 action = (lambda n: x ** n) # x r

我的问题是关于封闭范围的规则。在下面的代码段中,如果x=x未传递到F2的标头,则将出现错误

def f1():
    x = 88
    def f2(x=x): # Remember enclosing scope X with defaults
        print(x)
    f2()
f1()
但是我不明白为什么在下面的代码片段中lambda中不需要“x=x”

def func():
   x = 4
   action = (lambda n: x ** n) # x remembered from enclosing def
   return action

x = func()
print(x(2))
在下面的代码段中,如果x=x未传递到F2的标头,则将出现错误

def f1():
    x = 88
    def f2(x=x): # Remember enclosing scope X with defaults
        print(x)
    f2()
f1()
不,不会:

>>> 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


有关这种差异在何处很重要的一个非常常见的现实例子,请参见官方常见问题解答。

我不认为这是dup的可能重复(尽管它肯定是相关的)。问题和接受的答案都没有提到默认参数值hack。您确定这是您要发布的代码吗?