分享

Python之闭包与延时绑定问题

 iceer1212 2023-06-11 发布于广东

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多