python中的嵌套作用域
我的问题是关于封闭范围的规则。在下面的代码段中,如果x=x未传递到F2的标头,则将出现错误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
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。您确定这是您要发布的代码吗?