Day12课后有感
今日内容概要
-
名称空间
-
名字的查找顺序
-
作用域
-
global与nonlocal关键字
-
函数名对象
-
函数的嵌套
我觉得我学会了?学废了?
名称空间的概念
其实就是存放变量名与变量值绑定关系的地方 类似于商品库存表,记录物品与存放地址
名称空间的分类
1.内置名称空间
python解释器提前给我们定义好的,python自带的作用域,打开python➡️空间运行 关闭程序➡️空间消失
举个🌰
len() print() open()
2.全局名称空间
在py文件中编写的代码运行产生的名字都会存到全局名称空间,打开py文件➡️空间运行 关闭py文件➡️空间消失
举个🌰
name = 'jason' # 变量名name存入全局名称空间
def index(): # 函数名index存入全局名称空间
pass
if True:
a = 111 # 变量名a存入全局名称空间
for i in range(10): # 变量名i存入全局名称空间
pass
while True:
b = 222 # 变量名b存入全局名称空间
3.局部名称空间
函数体代码运行产生的都是局部名称空间,函数代码体运行➡️空间运行 函数代码体关闭➡️空间消失
举个🌰
def index():
name = 'jason' # name存入局部名称空间
名字的查找顺序
"""
名称空间是用来存放名字与值绑定关系的地方
那么问题来了 如果我要查找一个名字 到底去哪个名称空间 是否有先后顺序
"""
# 在查找名字的时候 一定要先搞清楚自己在哪个空间
1.如果在局部名称空间,局部名称空间专门存放函数体代码的(比作房间抽屉)
局部名称空间 >>> 全局名称空间 >>> 内置名称空间 # 如果你要找的东西记得放在房间抽屉里的,那么就先找房间抽屉,找不到就在房间里找一遍,再不行全屋搜查。
(房间抽屉) (房间) (整个python屋)
2.如果在全局名称空间 # 如果你要找的东西记得放在房间里了,直接从房间开始找,找不到再扩大搜查范围
全局名称空间 >>> 内置名称空间
(房间) (整个python屋)
# 想办法让三个名称空间中都有相同的名字
举个🌰
len = '我是全局名称空间中的len' # 本来就有的条件,不用搭理
def index(): # 真正添加 '局部名称空间的len' 的运行代码。
len = '我是局部名称空间中的len' # 赋值
print(len) # 运行一下
index() # 调用函数 函数体就会执行 就会产生局部名称空间 # 函数调用一下,你就有了三个相同的名字,python解释器本身自带len,py文件里也编写了,也写了个函数
print(len)
x = 111
"""如果函数没有被调用 那么不要去管函数体代码有多复杂 先跳过"""
def f1():
x = 222
def f2():
x = 333
def f3():
print(x) # 检测语法的时候 发现f3的局部名称空间将来会有x 所以查找的时候就跟f3的局部名称空间要(特例 可以忽略)
x = 444
# print(x)
f3()
f2()
f1() # 这条代码会报错,主要是理解两句注释的概念,学习找名字顺序
好冷漠的局部名称空间呀~~各自独立,互不相干
作用域
# 作用域就是名称空间能够作用的范围。(我要给你开辟一个空间)
内置名称空间
程序任意阶段任意位置均可使用(全局有效)
全局名称空间
程序任意阶段任意位置均可使用(全局有效)
局部名称空间
一般情况下只在各自局部名称空间中有效(局部有效)
'''也可以通过一些手段打破规则''' (啥手段,我会学到吗???)
global与nonlocal关键字
global实际运用:
nonlocal实际运用 :
函数名的多种用法
虽然报错了,但是看着上面各种花里胡哨的颜色,记得更牢了
函数的嵌套
函数的定义