外部函数能修改闭包内的变量_闭包可以引用其外部函数的局部变量和参数

5df11f7488a5911ad04f6c83b5347a8f.png

  闭包可以引用其外部函数的局部变量和参数。这是怎么回事呢?今天番茄加速就来讲一下。

  返回函数

  函数名是变量名,那么自然可以作为函数的返回值返回。

  def lazy_sum(mylist):

  def sum():

  return reduce(lambda x, y: x + y, mylist)

  return sum

  如上所示,lazy_sum函数返回一个函数,其名字叫做sum,它如何使用呢?

  mysum = lazy_sum([1,3,5,7])

  print(mysum)

  #.sum at 0x7f42c4166c80>

  lazy_sum的返回函数赋值给mysum,当我们打印mysum时发现,并没有真正运行内部包裹的函数sum,而是返回一个sum的地址值,因此这是一种延迟加载。

  so,调用 mysum()

  结果:

  16

  这才真正运行了内部函数sum

  一般的函数,比如:

  def sum2():

  return reduce(lambda x, y: x + y, mylist)

  我们直接调用 rslt = sum2([1,3,5,7]),直接拿到结果了。

  注意,lazy_sum(mylist)的参数为mylist,而位于它内部的函数sum()是没有参数的,但是sum()函数在内部却可以引用外部函数的参数 mylist,这说明什么?

  闭包

  当函数lazy_sum返回了一个函数sum后,外部函数lazy_sum的变量还被内部函数或返回的新函数sum引用,这被称为闭包。

  一般地,函数内部的临时变量或参数只能被它自己所用,不可能被其他函数引用。

  但是,闭包时,返回的内部函数却可以引用其外部的函数中的临时变量和参数。

  闭包例子

  """

  lazy sum

  """

  def lazy_sum2(mylist):

  tmp=10

  def sum():

  return reduce(lambda x, y: x + y, mylist)

  return sum,tmp

  sumfun,tmp = lazy_sum2([1,3,5,7])

  print(sumfun())

  #16

  print(tmp)

  #10

  可以看到lazy_sum2函数内的tmp临时变量可以被内部函数sum引用

  总结:闭包具有延迟加载特性,返回的函数可以引用其外部函数的局部变量和参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值