Python作用域总结

article/2025/11/6 21:05:35

Python特有的语法规则和诸如Java等其他静态类型语言有很大不同,而作用域规则则是其一,初识Python会遇到一些问题,现在对Python作用域相关的知识做个总结。

Python作用域规则一句话概括就是 LEGB 规则; L 代表 Local、E 代表 enclosing、G 代表 Global、B 代表 Builtin

作用域由 Python 的代码文本决定,一个模块定义了一个 Global 作用域、一个函数定义一个 Local 作用域; 作用域与一个名字空间一一对应,名字空间是一个mapping对象,它存储了当前作用域中的变量名字以及名字所绑定的对象。不同作用域中的变量名是不相关的。大概关系如下图:
这里写图片描述

假设一个模块中定义一个函数,在函数外面定义了变量a,b; 在函数中定义变量a,c, 模块本身也有Local命名空间,只是和 Global 是同一个命名空间。

除了 Global 和 Local 作用域,还有一个最顶层的作用域 – Builtin 作用域。 Builtin 作用域对应于 Builtin 命名空间,里面包含了内置函数和其他一些内置的东西。既然是系统内置的模块,地位自然非同一般,可以认为在任何模块作用域外面都有一层 Builtin 作用域。

当引用一个变量时,会首先在当前 Local 作用域的命名空间中查找,没找到就去 Global 命名空间查找,再没找到就会去 Builtin 命名空间查找,再没找到就会抛出异常。

a = 1
b = 2def func():a = 3c = 4print(a)    #打印3  Local 中找到,直接打印print(b)    #打印2  Local 中不存在,去 Global 找print(abs(-5))    #打印5 abs先去 Local 再去 Global找,都没找到,去 Builtin 中找#print(haha)       #报错,name 'haha' is not definedprint(a)        #打印 1  直接在 Global 中找

在 func 中通过 b = 10 这样的语句是不会修改 Global 中的 b 的,而是会在 Local 命名空间中添加一个名字 ‘b’ 并绑定值为 10
这里写图片描述

要想修改 Global 中的 b, 需要这样
这里写图片描述

前面介绍了 L G B 所代表的作用域以及它们之间的关系,还有查找一个变量的顺序 L -> G -> B,下面介绍比较特殊的 E。
当在函数内部再定义一个函数时,就形成了函数嵌套,形成了闭包,而内层函数的直接外部作用域是外层函数,这块作用域就是 enclosing, 例:

a = 1
def wrapper():a = 2def inner():print(a)inner()wrapper() #执行这句后,会打印2

这里内层函数会先找最内层作用域,即 inner 的 Local 命名空间,没有找到则会到 wapper 的 Local 命名空间找,找到后打印,找不到时才会再往 Global 中去找。 这里在 inner 中直接去修改 wrapper 中的变量还是不起作用的,只会在inner 的 Local 命名空间中添加名字和值,要想修改 enclosing 作用域中的值,
需要这样:
在 Python2 中:

def wrapper():a = 1count = [a]def inner():count[0] += 1print 'a:', areturn count[0]return innerinner = wrapper()
print inner()
print inner()
#打印
# a: 1
# 2
# a: 1
# 3

这里是借用一个列表间接修改,实际 a 的值并没有变。

Python3中,提供了一个 nonlocal 关键字,用于直接修改闭包变量

def wrapper():a = 1def inner():nonlocal aa += 1return areturn innerinner = wrapper()
print(inner())
print(inner())

至此所有的作用域介绍完毕,总的来说当寻找某个变量时从最内层开始找,按照
L -> E -> G -> B 的顺序逐层查找。


其他问题:

a = 1def func():print(a)a = 1print(a)func()

执行上面的代码会报错 UnboundLocalError: local variable ‘a’ referenced before assignment,这是因为在执行第一句 print 时直接就去 Local 中去找了,并且还找到了,但是不幸的是,当前 Local 中的 a 虽然找到了,但是还不可用,赋值语句在下面,Python 是在编译完成后,未执行程序时,就已经知道了 Local 作用域中藏着一个 a,这体现了 Python 作用域的静态性。

在作用域的问题上,只要记住以文本定义为准,而不看在哪里调用的,可以理解为在 python 解释器执行代码时,定义一个函数时,就已经将 Global 和 Local 命名空间绑定到函数对象上了,这个 Global 和 Local 就是函数执行时的环境。

另外内置函数 globals() 和 locals() 分别返回了当前 Global 命名空间和 Local 命名空间的内容。


http://chatgpt.dhexx.cn/article/lIZPVil9.shtml

相关文章

python作用域问题

python作用域问题 有一句话很重要,要说在前面;类型是属于对象的,并不是属于变量; 而在python这门语言中,有一种说法叫做“鸭子类型”:“当看到一直鸟走起来像鸭子,游泳起来像鸭子 ,叫起来也像…

python的作用域问题

命名空间 python中的namespace (命名空间)是映射到对象的名称。 命名空间的几个常见示例: abs() 函数、内置异常等的内置函数集合;模块中的全局名称;函数调用中的局部名称。对象的属性集合也算是一种命名空间。关于命…

实用解决Python作用域问题

前言:一直以来对Python的作用域问题有很多的疑惑,看了很多大牛的讲解之后有所收获,所以就记录下来 1、块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域 if 1…

python变量的作用域

作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。 作用域英文简写局部作用域LocalL嵌套作用域EnclosedE全局作用域GlobalG内置作用域Built-inB 四种作用域中变量…

linux-虚拟化管理工具

一、虚拟化管理工具 1.虚拟机的安装 用图形方式进行虚拟机的安装 安装镜像 设置虚拟机名字和占用内存大小 2.虚拟机的脚本安装 vim /bin/vm_create.sh 建立在/sbin目录底下,方便以后使用 #!/bin/bash ##幻数,脚本中命令…

常用虚拟机软件推荐

很多时候,由于工作的需要,都需要在不同的系统环境中进行调试开发,要么自己有多台电脑,安装不同的系统,要么给电脑装多系统。但这些都不是很现实,前者要资金,后者想进行系统切换也够费劲的了&…

理解全虚拟、半虚拟以及硬件辅助的虚拟化

接触过的一些搞了几年云计算的童鞋,也没明白常见的几种虚拟机技术方案的异同,比如只是记住了半虚拟要在虚拟机装驱动而全虚拟不需要,也不知道有时候为什么需要打开BIOS里的VT项。本人呢,在看了各种讲解虚拟化的书籍之后&#xff0…

虚拟化(二):虚拟化及vmware workstation产品使用

虚拟化(一):虚拟化及vmware产品介绍 vmware workstation的最新版本是10.0.2。相信大家也都使用过,其中的简单的虚拟机的创建,删除等,都很简单,这里就不再详细说明了,下面我将简单介绍…

什么是虚拟化?

什么是虚拟化? “虚拟化“这个词只要是接触过计算机和网络的,或多或少都有听过。什么虚拟机、存储虚拟化、网络虚拟化、网络功能虚拟化(NFV)、虚拟资源池……今天从什么是虚拟化讲起。 什么是虚拟化 由于虚拟化在各种企业的技术…

虚拟化管理工具的安装与使用

虚拟化管理工具的安装与使用 Libvirt是一个软件的集合,包括API库,后台运行程序(Libvirtd)和命令行工具(virsh)。 Libvirt主要有下面3个功能: 1 虚拟机管理:以虚拟机为对象,Libvirt提供了定义,删除&#x…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件,用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统,例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境,使用户…

虚拟机的虚拟化如何开启?

大家可以在任务管理器-性能中,查看“虚拟化”是【已启用】还是【已禁用】。如果是禁用了,可以接着往下看我们如何开启虚拟化。 1、关闭电脑的快速启动 控制面板-电源选项-选择电源按钮的功能-更改当前不可用的设置;把关机设置中的【所有都取…

kvm虚拟化管理工具

kvm虚拟化管理工具 一、什么是云计算?二、云计算的基础KVM虚拟化三、安装kvm虚拟化管理工具四、virsh虚拟机的日常操作(开关,挂起虚拟机,导配置文件,磁盘增容,转化磁盘格式等)五、快照管理六、KVM虚拟机的克…

有哪些虚拟化和容器化工具推荐? - 易智编译EaseEditing

以下是几个常用的虚拟化和容器化工具推荐: VMware vSphere: VMware vSphere 是一套完整的虚拟化平台,包括虚拟化服务器、虚拟化存储和虚拟化网络。 它提供了高性能的虚拟机管理和资源调度功能,适用于企业级的虚拟化部署。 Docke…

KVM虚拟化工具简介及安装

文章目录 1. KVM简介2. 安装前提3. KVM安装4. KVM启用5. 虚拟机安装和设置 1. KVM简介 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理&#xff…

虚拟化工具介绍 (资源)

2019独角兽企业重金招聘Python工程师标准>>> 常见的虚拟化产品:docker、Hyper-V、VMware、VirtualBox、XenServer、Kvm、Qemu、OpenVZ、Xen、CloudStack、Openstack、云计算、云其他。 常见的虚拟化 技术 :ESXI、XEN、KVM、HP-V、Docker、Virtual-BOX, 使用最广泛…

AppScan 10中文版

教程: 1、下载解压缩,得到获得AppScan10中文版原程序; 2、首先双击“AppScan_Setup_10.0.0.exe”开始安装,选择简体中文; 3、勾选“我接受许可协议中的全部条款”,然后继续安装; 4、选择软件安…

安全测试工具APPScan下载安装及简单使用

一、安装 百度随便找了个网址下的,解压后如图:AppScan_Std_9.0.3.7_Eval_Win.exe是安装程序,LicenseProvider.dll是替换文件。安装包600多MB建议硬盘留存避免重复下载。 安装简单,注意修改下安装路径,另外会弹出提示是…

AppScan

AppScan是用于web项目的安全测试工具,扫描网站所有url(自动手动),自动测试是否存在各种类型的漏洞。 使用步骤 选择记录 就会弹出appscan自带的浏览器,在其中输入账号密码,appscan就会自动记录 点击下一步…

Appscan测试工具简介

具用途? IBM公司的web扫描工具,对网站等WEB应用进行自动化的应用安全扫描和测试。 如何工作? 探索(Explore):在探索阶段,Appscan试图遍历网站中所有可用的链接,并建立一个层次结构。它发出请求,并根据响…