作用域---->作用范围(作用域又叫作用范围,在什么范围内有效)
一、全局作用域:包含内置名称空间、全局名称空间
1.存活周期:该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)
2.全局有效,在任意位置都可以使用,被所有函数共享
二、局部作用域:包含局部名称空间
1.存活周期:该范围内的名字临时存活(在函数调用时临时生成,调用结束后就释放)
2.局部有效,只能在函数内使用
三、global与nonlocal
1.如果在局部中想要修改全局的名字所对应的值,那么就需要global,主要针对不可变类型
示例1:global主要是针对不可变类型
x = 100 # 全局名称空间(也是全局作用域)
def func():
global x # 使用global,表示修改全局作用域中的x
x = 200 # 在函数内,表示为局部名称空间(也是局部作用域)
func()
print(x) # 输出结果为:200,x=200为局部作用域,也是局部名称空间,这里使用了global(表示修改全局中的),所以修改了全局中的x = 100
示例2:示例1中主要是针对不可变类型的,示例2针对可变类型
x = [] # 全局名称空间,声明的是一个数组
def func():
a.append(111) # 直接对数组进行添加操作,对于可变类型的就不用使用global了,因为在函数中可以直接对可变类型进行操作
func()
print(x) # 输出结果为:[111]
2.修改函数外层函数包含的名字对于的值(与global一样针对不可变类型),这是需要使用nonlocal
示例1:针对不可变类型
x = 100 # 全局名称空间
def func():
x = 200 # 局部名称空间
def func1():
nonlocal x # 表示修改该层函数上层函数的x,如果有三层函数,找上层表示先找第二层,如果没有找到则会找第一层,如果还没有就会报错,不会找全局
x = 300
func1()
print(x) # 输出结果为:300,x =300为局部作用域,这里使用了nonlocal(表示修改func1上一层中的名称对应的值),所以修改了x=200的值
func()
示例2:针对可变类型时,与global一样的,直接进行修改即可,不适用nonlocal