Python 这个函数如何找到另一个变量的值?
代码如下:Python 这个函数如何找到另一个变量的值?,python,scope,Python,Scope,代码如下: def caller(callee): callee() def wrapper(): def a(): print v0 for i in range(5): v0 = i*i caller(a) wrapper() 上述代码输出: 0 1 4 9 16 但是我不明白a如何解析变量v0。我找不到与此语言功能相关的python文档。请记住,函数中的所有代码在调用函数之前都不会运行。调用a()时,v0已
def caller(callee):
callee()
def wrapper():
def a():
print v0
for i in range(5):
v0 = i*i
caller(a)
wrapper()
上述代码输出:
0
1
4
9
16
但是我不明白
a
如何解析变量v0
。我找不到与此语言功能相关的python文档。请记住,函数中的所有代码在调用函数之前都不会运行。调用a()
时,v0
已在外部范围内定义,因此它可以识别变量并对其求值。函数中定义的变量范围包括其中的所有嵌套函数。因此,在wrapper()
中定义的变量可以在a()
中访问,因为该函数嵌套在其中。这被称为词法作用域,通常用于创建闭包
Python文档对此进行了解释:
作用域定义名称在块中的可见性。如果在块中定义了局部变量,则其范围包括该块。如果定义出现在功能块中,则范围将扩展到定义块中包含的任何块,除非包含的块为名称引入不同的绑定
函数
a
是在每次调用wrapper
时定义的。调用a
的给定实例时,它会在其定义的上下文中查找v0
,这是对定义它的包装器的特定调用。在调用a
时,v0
已在wrapper
中定义,并且a
使用v0
的定义
在本例中,当调用a
时,定义a
的wrapper
调用仍处于活动状态,但不需要这样做。换句话说,wrapper
可以返回,并且仍然可以从该上下文调用对a
的引用。在这种情况下,这将是一个关闭。但在本例中没有出现这种情况
下面是一个使用闭包的示例:
def foo(x):
def bar():
return x
return bar
f1 = foo(123)
f2 = foo(456)
print(f1())
print(f2())
输出为:
123
456
调用foo
时,它返回一个bar
实例,该实例在调用foo
的上下文中计算x
。在第一次调用中,x
是123,在第二次调用中是456
。这些绑定即使在对foo
的调用返回之后仍然存在。这里有一些关于这方面的阅读材料:可能重复@Zizouz212,在这段代码中没有全局变量(除了函数包装器
和调用方)。具体来说,v0
不是全局的。@TomKarzes呃,没错,现在我想起来:)