• Python之闭包与延时绑定问题


    闭包定义:
    1、闭包是一个嵌套函数
    2、闭包必须返回嵌套函数
    3、嵌套函数必须引用一个外部的非全局的局部自由变量

    # 面试题

    def num():
      return [lambda x:i*x for i in range(4)]
    # num() -> [函数,函数,函数,函数]
    print([ m(2) for m in num() ])

    #output: [6,6,6,6]

    这不是闭包:

    def foo1():
      print('fo1')
      def foo2():
        print('fo2')
    foo2()

    这才是闭包:

    def foo1(n):
      def foo2(m):
        return n + m
      return foo2

    a = foo1(2)
    print(a(3))

    这也是闭包:

    def foo1():
      var = 'hello'
      def foo2():
        print(var)
        return foo2
    a = foo1()
    a()

    回到题首,这是一个闭包,为了便于理解,我们可以把代码改成:

    def mul():
      func_list = []
      for i in range(4):
        def lam(x):
          return x*i
        func_list.append(lam)
      return func_list

    print([m(2) for m in mul()])

    怎么理解呢?简单来说,在python里,相对而言的局部变量绑定的是值,非局部变量绑定的是空间, 而不是值本身,所以,for循环生成的i,相对于函数lam来说,是全局变量,所以绑定的是i所在的内存地址,但i最后变成了3,lam绑定的是3。所以导致了,生成的四个函数所得值时相同的.

  • 相关阅读:
    各种编译器
    C99特性
    动态内存分配
    MDK C++编程说明
    C++类的大小计算
    WPF DataGrid添加编号列
    WPF实现打印用户界面功能
    WPF DataGrid 导出Excel
    知识点总结
    Winfrom控件使用
  • 原文地址:https://www.cnblogs.com/zhtook/p/13067941.html
Copyright © 2020-2023  润新知