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

    上一篇: python: how binding works

    下一篇: passing object to object