闭包 global 和 nonlocal

闭包

一个函数在调用的时候, 内部的自由变量, 要到这个函数被定义的地方去找, 而不是在这个函数当前被调用的地方去找,这个函数连同它被定义时的环境一起, 构成了一个数据结构, 就是闭包。
闭包传递的是上下文。
形成闭包的条件

  1. 必须要有一个内嵌函数
  2. 内嵌函数中要对自由变量的引用
  3. 外部函数必须返回内嵌函数
name = '张三'
def fun():
  def one():
    print(name)
  return one
f = fun()
f()

闭包是“打通”了上下文 把调用时候的上下文 给定义时候的环境用。
简单来说,定义函数fun、one的时候,都不用处理变量name的定义和赋值问题。name的定义和赋值在最外层调用的时候负责,这样能更好的把代码功能分开。

global

global 把局部变量设置为全局变量

name = '张三'
def fun():
  global name
  name = '李四'
def fun2():
  print(name)
>>> fun2()
张三
>>> fun()
>>> fun2()
李四
>>> 

nonlocal

nonlocal 把局部变量,“下放”到上层空间用

name = '张二'
def fun():
 name = '张三'
 def fun2():
    def fun3():
      nonlocal name
      name = '李四'
    print(name)
    fun3()
    print(name)
  print(name)
  fun2()
  print(name)
fun()
print(name)
>>> fun()
张三
张三
李四
李四
>>> name
'张二'

你可能感兴趣的:(闭包 global 和 nonlocal)