Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这个函数如何找到另一个变量的值?_Python_Scope - Fatal编程技术网

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呃,没错,现在我想起来:)