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。所以导致了,生成的四个函数所得值时相同的.

 

posted @ 2020-06-08 19:50  Mr_zho  阅读(146)  评论(0编辑  收藏  举报