python:绑定如何工作

gru*_*czy 10 python closures nested-function

我试图理解,python中的变量绑定是如何工作的.我们来看看这个:

def foo(x):
    def bar():
        print y
    return bar

y = 5
bar = foo(2)
bar()
Run Code Online (Sandbox Code Playgroud)

这打印5对我来说似乎是合理的.

def foo(x):
    def bar():
        print x
    return bar
x = 5
bar = foo(2)
bar()
Run Code Online (Sandbox Code Playgroud)

打印2,这很奇怪.在第一个示例中,python在执行期间查找变量,在第二个示例中查找方法.为什么会这样?

要清楚:这非常酷,并且完全按照我的意愿工作.但是,我对内部条形函数如何获取其上下文感到困惑.我想明白,引擎盖下会发生什么.

编辑

我知道,局部变量具有更高的优先级.我很好奇,python在执行过程中如何知道从我之前调用的函数中获取参数.bar已创建foo并且x不再存在.它x在创建函数时将其绑定到参数值?

csc*_*hol 7

第二个例子实现了所谓的闭包.该函数从其周围的上下文(即函数bar)引用变量.这先于对全局变量的引用.xfoox

另请参阅此问题您能解释闭包(因为它们与Python有关)吗?


Sal*_*cha 7

你提到的问题是python中变量的词法与动态范围之一.为了明确,python定义了以下四个范围.

  1. 最先搜索的最内层作用域包含本地名称
  2. 从最近的封闭范围开始搜索的任何封闭函数的范围包含非本地名称,但也包括非全局名称
  3. 倒数第二个范围包含当前模块的全局名称
  4. 最外面的范围(最后搜索)是包含内置名称的命名空间

在第一个例子中,"y"在函数栏之外定义,python搜索最里面的范围并向上移动直到它在模块中找到全局变量"y"

在第二个例子中,"x"由函数foo(x)定义,当x被打印在bar中时,x属于封闭函数的范围.纯粹来说,已经定义了一个闭包.

为了进一步研究python中的作用域,我发现下面的文章很好