python变量作用域

模板网 2021-04-14

在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。 需要注意的是:在if-elif-else、for-else、while、try-except\try-finally等关键字的语句块中并不会产成作用域。

python变量的作用域大概分为以下四类:

  • L(local) 局部作用域
  • E(Enclosing) 闭包函数外的函数中
  • G(Global) 全局作用域
  • B(Built-in) 内建作用域

遵循LEGB原则:以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中 找。按这个查找原则,在第一处找到的地方停止。如果没有找到,则会出发NameError错误。

x = int(2.9)  # 内建作用域

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

一、局部作用域

局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用 自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部 定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否 处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。

注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

二、嵌套作用域

也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是 定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

三、全局作用域

即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是 一个模块对象的属性。

注意:全局作用域的作用范围仅限于单个模块文件内

四、内置作用域

系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。

相关文章

  1. 常见排序列表

    常见排序列表 中文名称 英文名称 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 选择排序 Selection n^2 n^2 n^2 1 不稳 冒泡排序 Bub

  2. redis特殊功能

    一、慢查询 生命周期 两点说明: (1)、慢查询发生在第三阶段 (2)、客户端超时不一定慢查询,但慢查询是客户端超时的一个因素。 两个配置 ``` (1)、slowlog-max-len

  3. solr性能优化

    一、简介 Solr性能优化是一个很复杂的任务,也是一个长期与之斗争的过程。在开始之前,首先要对影响Solr性能的基本因素有个大致的认知。影响Solr性能的一个主要因素就是内存。Solr需要有足够的内

  4. 反向代理缓存

    一、传统代理 很久以前,我们通常需要通过代理服务器来访问互联网上的Web站点,代理服务器本身接入了互联网,而我们通过内部网络与代理服务器相连。即便是现在,有些时候为了访问一些由于某种原因无法直接访问

  5. redis的过期策略以及内存淘汰机制

    一、分析 这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置

随机推荐

  1. 常见排序列表

    常见排序列表 中文名称 英文名称 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 选择排序 Selection n^2 n^2 n^2 1 不稳 冒泡排序 Bub

  2. redis特殊功能

    一、慢查询 生命周期 两点说明: (1)、慢查询发生在第三阶段 (2)、客户端超时不一定慢查询,但慢查询是客户端超时的一个因素。 两个配置 ``` (1)、slowlog-max-len

  3. solr性能优化

    一、简介 Solr性能优化是一个很复杂的任务,也是一个长期与之斗争的过程。在开始之前,首先要对影响Solr性能的基本因素有个大致的认知。影响Solr性能的一个主要因素就是内存。Solr需要有足够的内

  4. 反向代理缓存

    一、传统代理 很久以前,我们通常需要通过代理服务器来访问互联网上的Web站点,代理服务器本身接入了互联网,而我们通过内部网络与代理服务器相连。即便是现在,有些时候为了访问一些由于某种原因无法直接访问

  5. redis的过期策略以及内存淘汰机制

    一、分析 这个问题其实相当重要,到底redis有没用到家,这个问题就可以看出来。比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置