名称空间与作用域
一、定义
用于存放变量名与变量值绑定关系的地方
二、名称空间的分类
1、内置名称空间
python解释器提前定义好的。如print()、len()
2、全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'jason' # name全局 def func(): # func全局 pass if 1: a = 123 # a全局 for i in range(10): print(i) # i全局 print(i)
3、局部名称空间
函数代码体运行之后产生的都是局部名称空间
4、存活周期
4.1、内置名称空间
python解释器启动与关闭而创建和销毁
4.2、全局名称空间
随着py文件的运行与结束而创建和销毁
4.3、局部名称空间
随着函数代码体的执行与结束而创建和销毁
三、名字的查找顺序
1、在查找名字的时候,要先确认自己当前在哪
1、如果你在局部,查找的顺序就是
局部 >>> 全局 >>> 内置
2、如果你在全局,查找顺序是
全局 >>> 内置
2、局部名称空间的嵌套
x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 def f4(): x = 555 print(x) # 结果为555 f4() f3() f2() # 通过调用f1 执行所有的函数 f1()
四、名称空间的作用域
作用域:名称空间所能够作用的范围
内置名称空间:程序任何阶段任何位置均可使用(全局有效)
全局名称空间:程序任何阶段任何位置均可使用(全局有效)
局部名称空间:一般情况下只在各自的局部名称空间中有效
五、global与nonlocal关键字使用
1、global使用
局部修改全局数据:如果数据为不可变类型则需要关键字global声明;如果数据为可变类型则无需要关键字global声明。
x = 111 def index(): # 局部修改全局变量 需要使用关键字声明 global x x = 222 index() print(x) name_list = ['jason', 'kevin'] def index(): name_list.append('heiheihei') index() print(name_list)
2、nonlocal使用
如果想要在内部的局部修改外部局部的不可变数据类型,需要关键字nonlocal声明。
def index(): x = 111 def func(): # 内部局部修改外部局部 nonlocal x x = 222 func() print(x) index()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构