Python-作用域

作用域是针对变量而出现。当变量被赋值的时候,变量当前的位置就决定了变量能够被访问到的范围,这个范围就叫变量的作用域,也可以叫变量的命名空间。

总的来说,在 Python 中存在 4 类作用域:本地作用域、嵌套作用域、全局作用域、内置作用域。即引用变量名的 LEGB 原则。

本地作用域

本地作用域是在函数内部生成的变量命名空间。

当程序在调用一个函数的时候,会为这个函数创建一个只属于它的命名空间,函数内部创建的变量,只能在函数内部使用,出了函数,变量会被自动回收。

嵌套作用域

嵌套作用域是在类、嵌套函数内部生成的命名空间。

在定义一个类的过程中,会在类中定义很多函数,即函数是组成类的方法属性。相对于类中的每个函数来说,类都是其下各个函数的嵌套作用域。当函数中查找不到某个变量的时候,会到类中查找这个变量。

当然,除了类,函数也可以嵌套函数,即函数的嵌套作用域是函数,这样的结构会发生闭包。

全局作用域

全局作用域指的是一个模块,即 Python 的源码文件(.py 文件)。

类和函数都是在模块中创建的,当变量在类和函数中都查找不到的时候,会跳转到模块中查找。模块中还可以通过 关键字引用其他模块的变量。

内置作用域

内置作用域其实也是一个 Python 的内置模块(builtins),只是在程序启动的时候,Python 虚拟机会自动加载这个模块,所以在程序的任何地方都可以使用内置模块里的变量。例:print 函数

总的来说,当程序执行一条语句的时候,会在当前作用域下(函数)搜索语句用到的变量;如果没找到,会往上层的嵌套作用域中搜索(类、函数);如果还是没找到,会继续往上层的全局作用域中搜索(文件);如果还是没找到,再往上层的内置作用域中搜索(builtins 模块)。最后还没找到的话,会抛出 NameError 的错误。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181024G20H3L00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券