Python-作用域、globas、locals-Python自学笔记2
Python函数2------作用域、globas、locals
作用域
作用域就是python程序可以直接访问命名空间的正文区域
在一个python程序中,程序的变量并不是在哪个位置都可以访问的,访问权限决定与这个变量实在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有四种,分别是:
- L(Local):最内层,包含局部变量,比如一个函数/方法内部 (局部作用域)
- E(Enclosing):嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的
- G(Global):当前程序的最外层,比如当前模块的全局变量
- B(Built-in):包含内建的变量/关键字等
此段引用 RUNOOB 的 Python3 教程 Python3 名称空间/作用域
Local(局部)
局部作用域可以引用全局作用域的变量,但是不能直接修改
全局作用域的不可变类型变量
实例1:
-
count = 1 def func(): count = 100 print(count) func()
结果:
-
func >>> 100
注意:这并不是修改了全局作用域的变量,是在局部创建了一个新的变量。全局变量并没有被修改。
-
# 在函数调用后打印全局变量count print(count) # 控制台打印 >>> 1
实例2:
-
count = 1 def func(): count += 2 print(count) func()
结果:UnboundLocalError: local variable 'count' referenced before assignment
原因:为什么报这个错误,因为局部作用域不能直接改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改操作,解释器会认为你在局部已经定义过了这个局部变量,python在局部没有找到这个变量所以就报错。
不是说python的取值顺序是局部名称空间
→全局名称空间
→内置名称空间
吗?为什么这次在局部名称空间没有找到就直接报错。
其实这次的报错原因归根到底是解释器的锅,上面提到了,是 解释器认为(仅仅是解释器认为)你在局部已经定义过了这个局部变量 所以python解释器并不会去全局名称空间寻找,只是在局部空间寻找,没有找到就直接报错。
Enclosing (嵌套)
count = 100 # 全局作用域
def func1():
count_1 = 2 # 对func2函数来说它是 Enclosing 作用域
def func2():
count_2 = 3 # 局部作用域
print(count_1)
print(count)
func1()
一般出现在一个函数里嵌套了另一个函数,在外层函数的作用域就叫 Enclosing 作用域 而内层函数的作用域 叫局部作用域
Global (全局)
例如python模块中的全局变量都属于全局作用域,就是在这个python程序中任何地方都能使用这个变量(仅限单个py文件)。
要注意 全局作用域不能使用 引用局部作用域内的任何东西。
Built-in (内置)
系统内置的变量及方法等
创建顺序与搜索顺序
创建各个作用域的创建顺序是:B Built-in
→ G Global
→E Enclosing
→L local
搜索顺序刚刚好相反就是前面说的就近原则:简称 LEGB
globals() 方法
globals()
可以获取全局名称空间 字典,该字典记录了当前模块的变量,包括函数、类等以及其他对象的映射关系。
实例:
-
a = "hello" b = "python" def func(): print(a + b) print(globals())
结果:
-
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000022B46F6F880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/XXXXX/Desktop/python_globals.py', '__cached__': None, 'a': 'hello', 'b': 'python', 'func': <function func at 0x0000022B48C2F430>}
locals() 方法
locals()
可以获取临时名称空间 字典,该字典记录了调用该方法的局部作用域内,所有对象的映射关系
实例:
-
def func(): a = 1 b = 2 def fun2(): pass print(locals()) func()
结果:
{'a': 1, 'b': 2, 'fun2': <function func.<locals>.fun2 at 0x000002165D77F4C0>}
拓展:
locals()
返回的并不是真正的局部名称空间字典,而是局部名称空间字典的拷贝,他并不能代表局部名称空间,所以locals()不能修改局部空间里的对象映射关系。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具