函数中的变量
1.局部和全局变量?
局部变量:在函数内部定义的变量就是局部变量
全局变量:在函数外部定义的变量或者在函数内部使用global关键字声明是全局变量
2.作用域:
局部变量的作用范围仅仅在函数的内部
全局变量的作用范围横跨整个文件
# 1 局部变量 def func(): a = 1 print(a) # 修改一个局部变量 a = 2 print(a) func() # print(a) error
3.生命周期:该变量的作用时长
内置命名空间 -> 全局命名空间 -> 局部命名空间 (开辟空间顺序)
内置属性 > 全局属性 > 局部属性 (作用时长:长->短)
"""
2.全局变量
1 b = 10 3 print(b) 4 # 修改一个全局变量 5 b = 20 6 print(b) 7 8 def func(): 9 print(b) 10 func() 11 结果: 12 10 13 20 14 20
3.函数内部定义全局变量
1 def func(): 2 global c 3 c =30 4 func() 5 print(c)
结果:
30
4.函数内部修改全局变量
1 d = 50 2 def func(): 3 global d 4 d = 51 5 func() 6 print(d)
总结:global的使用
如果当前不存在全局变量,可以在函数内部通过global关键字来定义全局变量
如果当前存在全局变量,可以在函数内部通过global关键字来修改全局变量
5. nonlocal的使用 (用来修改局部变量)
nonlocal遵循LEGB原则
(1) 它会找当前空间上一层的变量进行修改
(2) 如果上一层空间没有,继续向上寻找
(3) 如果最后找不到,直接报错
(1)它会找当前空间上一层的变量进行修改
1 def outer(): 2 a = 10 3 def inner(): 4 nonlocal a #如果不加nonlocal 打印 20,10 5 a = 20 6 print(a) 7 inner() 8 print(a) 9 outer()
结果:
20
20
(2)如果上一层空间没有,继续向上寻找
1 def outer(): 2 a = 20 3 def inner(): 4 a = 15 5 def smaller(): 6 nonlocal a 7 a = 30 8 print(a) 9 smaller() 10 print(a) 11 inner() 12 print(a) 13 outer() 14 15 结果: 16 30 17 20 18 20
(3)如果最后找不到,直接报错
"""nonlocal 只能修改局部变量,"""
1 a = 20 2 def outer(): 3 def inner(): 4 def smaller(): 5 nonlocal a 6 a = 30 7 print(a) 8 smaller() 9 print(a) 10 inner() 11 print(a) 12 outer() 13 error
(4) 不通过nonlocal 是否可以修改局部变量呢?ok
1 def outer(): 2 lst = [1,2,3] 3 def inner(): 4 lst[-1] = 3000 5 inner() 6 print(lst) 7 outer()
结果:
[1, 2, 3000]