名称空间与作用域
1.计算机基础2.编程语言和Python语言介绍3.八大基本数据类型4.python语法入门变量和常量5.python和pycharm相关补充6.计算机五大部件补充7.文件操作8.编码和解码9.字符编码10.基本数据类型的内置方法11.循坏结构12.流程控制13.基本运算符14.程序与用户交互15.迭代器16.闭包函数17.装饰器18.多层语法糖嵌套19.函数的参数20.函数的可变长参数21.命名关键字参数
22.名称空间与作用域
23.异常处理24.深浅拷贝问题25.函数的定义和调用26.控制文件读写内容的模式27.主动控制文件内指针移动28.文件的操作方法29.垃圾回收机制GC30.可变与不可变类型31.元类32.内置方法33.pickle模块34.单例模式35.方法补充issubclass和isinstance36.多态37.继承38.面向对象的三大特性39.封装40.内置函数41.面向对象42.logging模块43.subprocess模块44.正则45.datetime模块46.time模块47.绝对路径和相对路径48.random模块49.os模块50.hashlib模块51.模块与包52.json模块53.生成器54.三元运算符名称空间与作用域
(1)名称空间
(1)什么是名称空间
-
名称空间就是存放名字与对象映射/绑定关系的地方名称空间即存放名字与对象映射/绑定关系的地方。
- 对于x=3
- Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中
- del x表示清除该绑定关系。
-
在程序执行期间最多会存在三种名称空间
# x = 3 # # 开辟一块内容空间存放变量值 3 # # 用变量名 x 去引用这块内存空间 # name = 'dream' # print(x) # del x # print(x) # 内建名称空间 : 伴随Python解释器的启动,自动加载的名称空间和变量名 # del max # print(max([1, 2, 3, 4])) # 全局名称空间 :伴随Python解释器的开始执行,在内建空间的基础上扩充出来的名称空间 # 自己定义的 # name = 'dream' # 第三方导入的 # import random # 局部名称空间 : 伴随着函数或者类的启动而加载的名称空间 # def index(): # x = 3 # print(x) # index() # print(x) # 程序启动的加载顺序 : # 从内建开始(Python解释器自带的名称空间) # 其次全局(自己定义的变量名/函数名/类名) # 最后局部(定义在函数/类内部的变量名/类名/函数名) # 寻找一个变量名的加载顺序 # 先从局部开始找 # 局部找不到去全局找 # 全局还找不到就内建 # name = 'dream' # def index(): # print(name)
(2)变量作用域
- python变量作用域
- Local(局部变量)
- Enclosed(嵌套)
- Global(全局)
- Built-in(内置)
(1)Local局部变量
- Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡。
- 作用范围:当前整个函数体范围
"""局部变量作用域"""
# 作用范围整个函数
# 定义一个函数,函数内部就是局部作用域
def add():
#函数内的变量
a=3
print(a)
add()
#调用函数之后,找不大a,是因为在全局变量作用域中找不到变量a
print(a)
(2)Enclosed嵌套变量
- Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
- 作用范围:闭包函数
"""嵌套变量作用域"""
def add():
a=3
print(f"这是外层的:{a}")
def su():
print(f'这是内层:{a}')
#返回的是函数su的函数地址
return su
#调用add,函数add返回值是su的函数地址
su=add()
#调用add的返回值(su的函数地址),执行的是su
su()
(3)Global全局变量
- Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模
块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。 - 作用范围:当前模块(文件)
"""全局变量作用域"""
# 全局变量作用域,
# 定义在全局的变量,在任意位置都可以调用该变量
a=3
def add():
print(f'这是add打印的:{a}')
add()
print(a)
# 这是add打印的:3
# 3
(4)Built-in(内置)
- Built-in(内置):解释器内置的变量,比如int, str等。
- 作用范围:所有模块(文件)
- Python中没有块级作用域。
- 块级作用域:代码块中的变量,比如if、while、for后面的代码
总结
# 【1】全局作用域 :整个当前文件内的所有变量和变量名/函数名/类名 --- 必须先定义才能再调用
# 【2】局部作用域 :定义在外层函数内部/类的内部才能加载到的变量名/函数名/类名 --- 只能在局部内部才能使用
# 【3】嵌套作用域 :定义在内层函数内部的变量名/函数名/类名
# 【4】内建作用域 :随着Python程序启动而自动加载的名称空间
(3)LEGB规范和两个关键字的使用
- LGEB规则:按照L--->E--->G--->B的顺序查找变量。
- 也就是,当不同命名空间具有相同变量名称的变量时,我们首先查找局部变量,如果没有查到,再向全局变量查找。
(1)基于命名空间的常见变量类型
- 局部变量:
- 在一个函数体的内部定义的变量
- 作用域为函数内部
- 查看局部变量命令:locals()
- 全局变量
- 在函数体外部,文件最外层定义的变量
- 作用域为整个文件内部
- 查看全局变量命令:globals()
- 注意:
- 变量访问规则:从内到外
- 全局变量和局部变量重名时,采用就近原则
a='G全局'
def add():
a='E局部'
def su():
a='E局部2'
print(f'su打印的a:{a}')
su()
print(f'add打印的a:{a}')
add()
print(a)
# su打印的a:E局部2
# add打印的a:E局部
# G全局
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)