我正在尝试了解功能环境(全局,本地)。具体来说,当有一个已经全局定义的嵌套函数时,我会感到很困惑,例如:
def g(x):
print(x)
def f(f):
f(1)
f(g)
有人可以帮助我这个概念吗?我将不胜感激。
感谢。
答案 0 :(得分:4)
Python使用字典来保存本地和全局变量。在查找变量引用时,它将首先查看本地字典。如果要在全局字典中引用变量,请将global关键字放在其前面。
另请参阅this问题的答案以获取更详细的信息。
答案 1 :(得分:0)
我同意user18044,但是你对'f(f)'的困惑是什么?我同意这可能真的令人困惑,特别是在非类型语言中。 'f'的参数是一个函数句柄,它具有名为'f'的本地类型作用域。 python决定使用哪个'f'的方式由18044解释.Python在函数定义中查看名称'f',本地参数'f'对全局名称'f'进行预测,就像我们做的那样在一个函数中有一个全局变量'dude'和一个局部变量'dude'。当地覆盖全球。希望这有帮助,并且有意义。 : - )
答案 2 :(得分:0)
函数的locals包含传入的所有内容,以及分配给global
(或{3.}中的nonlocal
)的每个变量。
全局变量包含可在全局范围内看到的所有内容,包括函数本身。
当引用名称时,首先在本地中查找它,然后在本地中找不到全局内容。
运行语句f(g)
时,语句本身处于全局范围,因此没有本地语句。全局变量中都可以找到f
和g
:它们都是函数。调用由def f...
定义的函数,由def g...
定义的函数作为参数传递。
当f(f)
运行时,f
位于函数的本地。它与传入的值绑定,该值是def g...
定义的函数。函数体具有语句f(1)
。 1
是常量,不需要查找。在本地查找f
,找到传入的函数。它是 - 在全球范围内称为g
的函数 - 被称为。
因此,g
同样使用绑定到局部变量1
的值x
运行。这被转发到函数print
(在3.x中;在2.x中,print
是一个关键字,因此print x
是一个语句),它打印值{{1} }。