函数中的变量

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]

 

  

 

posted @ 2021-04-06 20:46  urls  阅读(395)  评论(0编辑  收藏  举报