zoukankan      html  css  js  c++  java
  • 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。所以导致了,生成的四个函数所得值时相同的.

  • 相关阅读:
    安装Ubuntu后需要做的事
    LaTeX的安装并使其能够编译中文
    让Windows中的文件名支持大小写
    安装VMware Tools的步骤
    强制删除文件或文件夹的方法
    工作中遇到的一些小问题
    redis主从复制
    Redis事务
    redis配置文件基本解析以及RDB持久化与AOF持久化
    redis 基本指令以及数据类型
  • 原文地址:https://www.cnblogs.com/zhtook/p/13067941.html
Copyright © 2011-2022 走看看