文章目录
名称空间
1. 什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方
名称空间的分类
1. 内置名称空间
python解释器提前定义好的,例:
print()
len()
...
2. 全局名称空间
在py文件中定格写的代码运行之后全都会存入全局名称空间
name = 'tom' # name全局
def func(): # func全局
pass
if 1:
a = 1 # a全局
for i in range(10):
print(i) # i全局
while True:
a = 1 # a全局
3. 局部名称空间
在函数体代码运行之后产生的都是局部名称空间
def func(): # func全局
a = 1 # a局部
def func1(): # func1全局
b = 2 # b局部
# 局部名称空间之间互不干扰 函数嵌套除外!!!
4.名称空间存活周期
1.内置名称空间
python解释器启动与关闭而创建和销毁
2.全局名称空间
随着py文件的运行与结束而创建和销毁
3.局部名称空间
随着函数体代码的执行与结束而创建和销毁
名字的查找顺序
# 在查找名字的时候 要先确定自己在哪
1. 如果在局部
局部 >>> 全局 >>> 内置
2. 如果在全局
全局 >>> 内置
# 局部名称空间的嵌套
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x = 555
print(x)
# x = 555 特例 写在print下面,会报错
f4()
f3()
f2()
# 通过调用f1 执行所有的函数
f1()
’x’ 查找循序流程图如下
名称空间的作用域
作用域
名称空间所能够作用的范围
内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效
global与nonlocal关键字使用
1.global使用
x = 111
def func():
#局部想修改全局变量需要使用关键字声明
global x
x = 222
func()
print() # 222
list1 = [11, 22]
def func1():
list1.append(333)
func1()
print(list1) # [11, 22, 333]
'''
如果想在局部修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则不需要关键字global声明
'''
2.nonlocal使用
def func():
x = 111
def func1():
# 内部局部修改外部局部
nonlocal x
x = 222
func1()
print(x) # 222
func()
def func():
l1 = [11, 22]
def func1():
l1.append(33)
func1()
print(x) # [11, 22, 33]
func()
'''
如果想要在内部的局部修改外部局部的不可变类型需要用nonlocal声明
可变类型不需要声明
'''