名称空间、作用域、函数名使用方法
今日内容概要
- 名称空间
- 名字的查找顺序
- 作用域
- global与nonlocal关键字
- 函数名对象
内容详细
名称空间#
#名称空间就是存放变量名与变量值绑定关系的地方,类似于民政局
"""
名称空间提供了在项目中避免名字冲突的一种办法,各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重复的名字,但是不同的名称空间有重复的名字不会被影响
"""
名称空间的分类#
可以分为三类:
1.内置名称空间:python解释器提前给我们定义好的
eg:len()、open()、print()
2.全局名称空间
在python文件中编写的代码运行产生的名字都会存到全局名称空间
name = 'tuzi' # # 变量名name存入全局名称空间
def index(): # 函数名index存入全局名称空间
pass
if True:
a = 1 # a存入全局名称空间
for i in range(1,10): # 变量名i存入全局名称空间
print(i)
pass
while True:
b = 22 # 变量名b存入全局名称空间
break
print(name,a,b)
3.局部名称空间 函数体代码运行产生的都是局部名称空间,记录了函数的变量,包括函数的参数和局部定义的变量
def index():
n = 111 # n存入局部名称空间
'''局部空间之间如果不是嵌套关系,那么互不干涉'''
def index1():
name = 'tuzi'
def index2():
age = 18
print(name) # 报错 name 'name' is not defined
index1()
index2()
名称空间的查找顺序#
查找一个名字的时候,要先搞清楚在哪个空间
1.如果在局部名称空间
局部名称空间>>>全局名称空间>>>内置名称空间
2.如果在全局名称空间
全局名称空间>>>内置名称空间
小例题#
len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print(len)
index1()
index() # 调用函数,函数体就会执行,就会产生局部名称空间
# 结果 我是局部名称空间中的len
print(len) # 我是全局名称空间中的len
########特殊#################
"""如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过"""
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
print(x)
def f4():
x = 555
print(x)
f4()
f3()
f2()
f1()
此段代码的运行顺序:
此段代码怎么查找的流程图:
名称空间的存活周期#
1.内置名称空间
python解释器运行 产生
python解释器关闭销毁
2.全局名称空间
python文件开始运行产生
python文件结束运行销毁
3.局部名称空间
函数他代码开始运行产生
函数体代码运行结束销毁
作用域#
# 作用域就是名称空间能够作用的范围
# 内置名称空间
程序任意阶段位置均可使用(全局有效)
# 全局名称空间
程序徐任意阶段任意位置均可使用(全局有效)
# 局部名称空间
一般情况下只在各自局部空间中有效(局部有效)
'''也可以通过global与nonlocal关键字打破规则'''
global与nonlocal关键字#
'gloabl关键字:局部空间修改全局空间不可变类型'
x = 111
def index():
# x = 222 # 并不是在修改全局的x而是在局部名称空间中创建了一个新的x,如果想要在局部名称空间中修改全局名称空间中的名字,那么需要使用关键字申明
global x # 申明 修改的时全局x而不是产生新的x
x = 666
return x
index()
"""
如果想要在局部修改全局的不可变类型
需要提前加关键字globals申明
如果想要在局部修改全局的可变类型
不需要加关键字global申明
"""
'nonlocal关键字:局部空间修改全局空间不可变类型'
def index():
a = 1
l1 = [111, 222, 333]
l1.append(1)
def index1():
nonlocal a # 修改的是index里的a的值
a = 333
print(a)
l1.append(444)
print(l1)
index1()
index()
"""局部名称空间嵌套的情况下,内层如果想要修改外层
情况1数据是不可变类型
需要使用关键字nonlocal
情况2数据是可变类型
不需要使用关键字nonlocal"""
函数名的多种用法#
def index():
print('form function index')
# 用法1:函数名可以当做变量名赋值
print(index) # <function index at 0x000001E0A287F158>
res = index # 让res也指向函数体代码
print(res) # <function index at 0x000001E0A287F158>
index() # form function index
res() # index() # form function index
用法2:函数名还可以当成函数的实参
def index ():
print('from index')
def func(a):
print('from func')
print(a) # <function index at 0x000002A375A6F158>
a() # from index
func(index)
# 用法3 函数名还可以当作函数的返回值
def func():
print('from func')
return index
def index():
print('form index')
res = func() # 接收函数返回的值,也就是index函数
print(res) # 指向的是index函数的内存地址
res() # index()
func()
# 用法4# 函数名可以作为容器类型的元素
'''容器类型:内部可以存档多个元素的数据类型>>>:列表\元组\字典'''
def index():
print('form index')
return 321321
l1 = [11,22,33,44,index]
print(l1)
l1[-1]() # 相当于 index()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人