美文网首页pythonPython
Python 闭包变量绑定问题

Python 闭包变量绑定问题

作者: xiaofudeng | 来源:发表于2017-03-19 14:22 被阅读77次

延时绑定

原文

Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.

即闭包中变量的绑定发生在闭包被调用时, 而非闭包定义时.

实例

# coding=utf-8
__author__ = 'xiaofu'

# 解释参考 http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures

def closure_test1():
    """
    每个closure的输出都是同一个i值
    :return:
    """
    closures = []
    for i in range(4):
        
        def closure():
            print("id of i: {}, value: {} ".format(id(i), i))

        closures.append(closure)

    # Python’s closures are late binding.
    # This means that the values of variables used in closures are looked up at the time the inner function is called.

    for c in closures:
        c()

def closure_test2():

    def make_closure(i):

        def closure():
            print("id of i: {}, value: {} ".format(id(i), i))

        return closure

    closures = []

    for i in range(4):
        closures.append(make_closure(i))

    for c in closures:
        c()


if __name__ == '__main__':
    closure_test1()
    closure_test2()

输出:

id of i: 10437280, value: 3 
id of i: 10437280, value: 3 
id of i: 10437280, value: 3 
id of i: 10437280, value: 3 
id of i: 10437184, value: 0 
id of i: 10437216, value: 1 
id of i: 10437248, value: 2 
id of i: 10437280, value: 3

需要注意的是, 对于第二个例子closure_test2(), 在调用完make_closure(i)(i < 3)之后, 循环里的i值改变了, 然而make_closure()函数中的i是不会受到影响的, 这一点从输出的id值也可以看出.

相关文章

  • Python 闭包变量绑定问题

    延时绑定 原文 Python’s closures are late binding. This means th...

  • JS第三天

    一、函数高级 1、函数回调 2、闭包 二、循环绑定 1、使用闭包解决局部变量生命周期 2、使用闭包解决变量污染问题...

  • 深入解析Javascript闭包及实现方法

    一、什么是闭包和闭包的几种写法和用法 1、什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的...

  • JavaScript 闭包

    1、什么是闭包? JavaScript的闭包是一个特色。官方解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的...

  • 2018-11-20

    python函数的闭包 闭包: 嵌套函数调用外部函数的变量 注意: 闭包必须是内部函数调用外部函数定义的变量,这其...

  • Python 入门之 闭包

    Python 入门之 闭包 1、闭包 (1)在嵌套函数内使用(非本层变量)和非全局变量就是闭包 (2)_ clos...

  • Python装饰器与闭包!

    闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数...

  • Python: 闭包

    闭包的概念 关于什么是闭包,下面是百度百科的解释 闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是...

  • golang-闭包

    最近学习golang的匿名函数 发现闭包还是有点意思 闭包基本概念:闭包是可以包含自由(未绑定到特定对象)变量的代...

  • 理解闭包

    欢迎移步我的博客阅读:《理解闭包》 闭包 是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码...

网友评论

  • maple1eaf:闭包中变量的绑定发生在闭包被调用时, 而非闭包定义时.
    这一句话对闭包延迟绑定的理解有巨大帮助,谢谢!

本文标题:Python 闭包变量绑定问题

本文链接:https://www.haomeiwen.com/subject/vabmnttx.html