作用域

含义:

又叫命名空间,python 创建、改变、查找变量名的地方。
在代码中变量名被赋值的位置决定了这个变量名能被访问到的范围。

意味着

  • 一个def内定义的变量名能被def内的代码访问到,不能在函数外部被引用
  • def 内的变量名与def 之外的变量名并不冲突
  • 一个变量的作用域与它被赋值的位置所决定

    三种作用域

  • 一个变量在def 内赋值,被定位在这个函数内 -> 本地作用域

  • 一个变量在一个嵌套的def中赋值,对于嵌套的函数来说,它是非本地的 -> nonlocal 自由变量
  • 在def之外赋值,就是整个文件全局的 -> 全局

    变量名解析:LEGB原则

    变量名引用分三个作用域进行查找:首先是本地,之后是函数内,之后全局,最后 内置
    默认下,变量名赋值会创建或者改变本地变量

闭包

含义

引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外
自由变量保存在:

  1. 闭包的 __closure__ 是一个cell 对象的元组
  2. __closure__[0].cell_contents 保存闭包的自由变量