python:绑定是如何工作的
我想明白,python中的变量绑定是如何工作的。 我们来看看这个:
def foo(x):
def bar():
print y
return bar
y = 5
bar = foo(2)
bar()
这打印5对我来说似乎是合理的。
def foo(x):
def bar():
print x
return bar
x = 5
bar = foo(2)
bar()
这打印2,这很奇怪。 在第一个例子中,python在执行期间查找变量,在第二个时候创建方法。 为什么这样?
要清楚:这是非常酷,并按我的愿望工作。 但是,我对内部条形函数如何获取其上下文感到困惑。 我想了解,发生了什么。
编辑
我知道,局部变量有更大的优先权。 我很好奇,python在执行过程中如何知道我之前调用的函数的参数。 bar
是在foo
中创建的, x
不存在。 函数创建时,它将此x
绑定到参数值?
第二个例子实现了所谓的闭包。 功能bar
从其周围的上下文引用变量x
,即函数foo
。 这在对全局变量x
的引用之前。
另请参阅此问题是否可以解释闭包(因为它们与Python有关)?
你所指的问题是Python中变量的词法与动态范围之一。 为了明确,python定义了以下四个范围。
在第一个示例中,在功能栏外部定义了“y”,python搜索最内层的范围并向上移动链,直到在模块中找到全局变量“y”
在第二个示例中,“x”由函数foo(x)定义,x属于封闭函数的范围,当它被打印在bar内部时。 用纯粹的术语来说,封闭已经被定义。
为了进一步研究python的范围,我发现下面的文章有很好的解读
在这两个示例中,查找都在运行时发生。 唯一的区别是有一个局部定义的变量x
,而没有一个局部定义的变量y
。
执行时...
def foo(x):
def bar():
print y
return bar
y = 5
bar = foo(2)
bar()
... print
语句查找名为y
的变量,并且仅在全局上下文中找到它,所以它使用该变量并打印“5”。
在......
def foo(x):
def bar():
print x
return bar
x = 5
bar = foo(2)
bar()
...当查找发生时,有一个范围变量x
定义 - 当foo
函数被调用时,它被固定为“5”。
关键是参数在传递给函数时被评估,因此外部函数foo
计算被调用时传入的参数。 这有效地在foo
函数的上下文中创建了一个名为x
的变量,因此无论何时执行bar
,都会看到该变量,而不是全局定义的变量。
这可能偶尔会引起混淆,如下面的代码所示:
lst = []
for i in range(5):
x = i
lst.append(lambda: x)
for func in lst:
print func() # prints 4 4 4 4 4
你需要做的是:
lst = []
for i in range(5):
def _func(x):
return lambda: x
lst.append(_func(i))
for func in lst:
print func() # prints 0 1 2 3 4
链接地址: http://www.djcxy.com/p/51113.html