名称空间的加载顺序: 1.启动解释器加载全局名称空间(内置函数等) 2.运行py文件运行全局名称空间(for if while) 3.执行函数运行局部名称空间
1.名称空间(变量,函数,内置函数)
""" 什么是名称空间? 存放名字的空间 如果你想访问一个变量值,必须先方向对应的名称空间,拿到名字和对应的内存地址的绑定关系 名称空间的分类: 1、内置名称空间: python提前给你的定义完的名字,就是存在内置名称空间 如:len max 等内置函数 2、全局名称空间 存放于文件级别的名字,就是全局名称空间 if while for 内部定义的名字执行之后都存放于全局名称空间 3、局部名称空间 函数内部定义的所有名字都是存放与当前函数的内置名称空间 生命周期: 1、内置名称空间 在python解释器启动的时候生效,关闭解释器的时候失效 2、全局名称空间 当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效 3、局部名称空间 当你调用当前函数时生效,函数体最后一行代码执行结束就失效 名称空间的查找顺序: """
2.查找顺序
""" 名称空间的查找顺序: 局部:局部 > 全局 > 内置 全局:全局 > 内置 # 内置再找不到就报错 # 函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关 """ # x = 1 # # def wrapper(): # 定义 # x = 2 # index() # 定义里面包含调用 # def index(): 定义 # x = 3 # print(x) # # wrapper() #调用:先定义 后调用 #### # x = 1 # def inner(): # x = 2 # def wrapper(): # print(x) # wrapper() #调用 # # inner() #### def index(): x = 2 # print(x) print(x) x = 1 def index(arg = x): print(x) print(arg) x = 2 index()
3.作用域
""" 作用域的分类: 1、全局作用域 全局可以调用的名字就存在于全局作用域 内置名称空间+全局名称空间 2、局部作用域 局部可以调用的名字就存放与局部作用域 局部名称空间 global:声明全局变量(***) nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*) 只有可变类型可以在局部修改外部变量的值 (*****) """ # x = 1 # # def index(): # 定义 # global x # 声明为全局变量并修改值 # x = 2 # index() # 调用 :在定义阶段,函数只会被读,不会被执行,一旦被调用 函数体会被执行 # print(x) ######## 函数先定义 后执行,函数体内的执行语句不会被执行,只有被调用的时候才会执行 # l1 = [] # def index(a): # l1.append(a) # print(l1) # index(1) # # print(l1) ######## 局部变量的修改无法影响只能影响到上一层 def index(): x = 1 def index2(): nonlocal x x = 2 index2() print(x) index() # 例题 : def f3(): x = 4 def f1(): y = 2 def f2(): nonlocal x x = 3 f2() print(x) f1() print(x) f3() 结果 33