python中全局global和局部nonlocal命名空间
局部名称空间对全局名称空间的变量可以引用,但是无法改变。
count = 1
def func1():
count = 2
print(count)
func1()
count = 1
def func1():
# count = 3
count = count + 1 # local variable 'count' referenced before assignment
print(count)
func1()
报错原因:如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,但是对于上面的例题,局部中没有定义,所以他会报错。
一. global
global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量
count = 1
def func1():
global count #在局部名称空间声明一个全局变量。
count = count + 1 #在局部名称空间声明可以对全局变量进行修改。
print(count)
func1()
print(count)
输出:
2
2
二. nonlocal
1. 子函数对父函数的变量进行修改
2. 此变量不能是全局变量
3. 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def func1():
count = 666
def inner():
print(count)
def func2():
nonlocal count
count += 1
print("func2",count)
func2()
print("inner",count)
inner()
print("funcl",count)
func1()
输出:
666
func2 667
inner 667
funcl 667