Python-作用域(全局与局部作用域)及global与nonlocal

一、作用域-》作用范围
全局作用域:内置名称空间、全局名称空间
1.全局存活
2.全局有效:被所有函数共享

实例:全局存活,全局有效,被所有函数共享
x=111
def f1():
print(id(x))
def f2():
print(id(x))

f1()
f2()
print(id(x))

#8791221658720
#8791221658720
#8791221658720

局部作用域:局部名称空间的名字
1.临时存活
2.局部有效:函数内有效
示例:如果在局部想要修改全局的名字对应的值(不可变类型),需要用global
x=111 #使用global,把全局的名称空间x值修改为222
def func():
global x #修改全局的名称空间x=111对应的值
x=222
print(x) #当前在局部名称空间,局部名称空间查询x名称空间,局部名称空间没有则去全局名称空间查找
    #222
func()
print(x) #当前在全局名称空间,全局名称空间查询x名称空间,全局名称空间没有则去内置名称空间查找
#222

使用可变类型,不需要global
l=[11,22]
def func():
l.append(33) #局部查找l名称空间没有,使用全局l名称空间

func()
print(l)
#[11, 22, 33]

nolocal(了解):修改函数外层函数包含的名字对应的值(不可变类型)
'''
x=0
def f1():
#如果注释f1函数内的名称空间会报错
#x=11 #nonlocal,把f1函数内名称空间x值修改为22
def f2():
nonlocal x #修改f2函数外层f1函数内的名称空间x=11对应的值
x=22
f2()

f1()
'''

x=0
def f1():
x=11 #nonlocal,把f1函数内名称空间x值修改为22
def f2():
nonlocal x #修改f2函数外层f1函数内的名称空间x=11对应的值
x=22
f2()
print(x)
#22
f1()
print(x)
#0

针对可变类型(不需要指定nolocal)
def f1():
x=[]
def f2():
x.append(11) #f2函数内查找名称空间,f2函数内没有查找到,继续查找,使用f1函数内的名称空间
f2()
print(x)
# [11]
f1()

重点
名称空间只有优先级之分,本身并无嵌套关系,画图只是为了理解
名称空间的嵌套关系决定了名字的查找顺序,而名称空间的嵌套关系是以函数定义阶段为准的,即函数的嵌套关系与名字的查找顺序是在定义阶段就已经确认好的


'''
def func():
global aa
aa=111
print(aa) #报错,定义函数不执行函数体代码,所以在全局没有aa变量 NameError: name 'aa' is not defined
'''

'''
def func():
global aa #声明全局名称空间,局部名称空间修改为全局的名称空间对应的值
aa=111
#aa=111 global aa就相当于把aa放在全局名称空间了
func()
print(aa)
# 111
'''
 
 
 
 
posted @ 2020-09-25 15:43  梁博客  阅读(238)  评论(0)    收藏  举报