1、在讲global和nonlcal前,先了解下全局变量和局部变量
例子1:不可变类型的全局和局部变量场景
# 全局变量
a = 1
def fun1():
# a此时是局部变量,数值类型是不可变类型,全局变量的a和局部变量的a地址不一样
a = 2
print(a)
fun1()
print(a)
例子2:可变类型的全局和局部变量场景
# list是可变类型,这里是全局变量
lst1 = [1,2,3,4,5]
print("全局lst1的内存地址:",id(lst1))
def fun2():
# list 重新赋值,就会新开辟一个新的内存地址。因此这里的lst1和全局lst地址不一样
lst1 = []
print("局部变量的lst1重新赋值后,重新分配一个内存地址为:",id(lst1))
lst1.append("a")
print(lst1)
fun2()
print(lst1)
例子3:可变类型进行在局部进行修改场景
···
list是可变类型,这里是全局变量
lst1 = [1,2,3,4,5]
print("全局lst1的内存地址:",id(lst1))
def fun2():
# list 重新赋值,就会新开辟一个新的内存地址。因此这里的lst1和全局lst地址不一样
lst1 = []
print("局部变量的lst1重新赋值后,重新分配一个内存地址为:",id(lst1))
lst1.append("a")
print(lst1)
fun2()
print(lst1)
def fun3():
# list 修改可变类型,此时不会重新分配内存地址
lst1[1]=3
print("局部变量的lst1进行值修改,此时不会重新分配内存地址:",id(lst1))
lst1.append("a")
print(lst1)
fun3()
print(lst1)
···
2、global & nonlocal
1)global:将变量声明为全局变量
a = 1
def test():
a = 2
print("局部变量a:",a)
test()
print("全局变量a:",a)
a = 1
def test1():
global aa
a = 2
print("声明globa a,代表此处我是全局变量a:",a)
test1()
print("全局变量a:",a)
!!!值得注意的一点是:
python中给变量重新赋值,就会给该变量重新开辟一个新的内存空间来存储
2)nonlocal:
c = 1
def test3():
c = 2
def test4():
# 此时这里c是局部变量
print("c:",c)
# 这里又重新声明局部变量,python会报错,搞不清楚这里的c到底是局部变量还是全局变量了
c = 3
test4()
print(c)
test3()
print(c)
修改后:
c = 1
def test3():
c = 2
def test4():
# 此时这里c是局部变量
# 声明c是外层函数test3的局部变量
nonlocal c
print("c:",c)
# 这里又重新声明局部变量,python会报错,搞不清楚这里的c到底是局部变量还是全局变量了
c = 3
test4()
print(c)
test3()
print(c)
和global比较
c = 1
def test3():
c = 2
def test4():
# 此时这里c是局部变量
# 声明c是外层函数test3的局部变量
global c
print("c:",c)
# 这里又重新声明局部变量,python会报错,搞不清楚这里的c到底是局部变量还是全局变量了
c = 3
test4()
print(c)
test3()
print(c)