python3 global和nonlocal 关键字

python变量引用顺序:从当前作用域开始寻找变量,如果没找到就往上一层作用域寻找,没找到就再上一层......

即:当前作用域局部变量->外层作用域变量->再外层作用域变量->......->当前模块全局变量->pyhton内置变量

global:全局变量

nonlocal:外层嵌套函数的变量

使用总结:

1、局部作用域改变全局变量用global, global同时还可以定义新的全局变量

2、内层函数改变外层函数变量用nonlocal, nonlocal不能定义新的外层函数变量,只能改变已有的外层函数变量

     同时nonlocal不能改变全局变量

一、没有关键字


  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer():
  3. a = 9 # a2 当前outter作用域局部变量
  4. def inner():
  5. a = 8 # a3 当前inner作用域局部变量
  6. print(a) # a3 8, 在inner的局部作用域中找到了a3
  7. inner() # inner()函数结束,a3作为inner局部变量被释放
  8. print(a) # a2 9,在outer局部作用域中找到a2
  9. outer() # outer()函数结束,a2作为outer局部变量被释放
  10. print(a) # a1 10, 在当前模块全局作用域中找到了a1

a1、a2、a3分别是不同变量

二、global关键字:声明此变量为全局变量

1、用于在局部作用域中修改全局变量


  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer():
  3. a = 9 # a2 当前outter作用域局部变量
  4. def inner():
  5. global a
  6. a = 8 # a3 既是全局变量a1,又是inner局部变量
  7. print(a) # a3 8,在inner的局部作用域中找到了a3
  8. inner() # inner()函数结束,a3作为全局变量被保留下来成为a1
  9. print(a) # a2 9,在outer局部作用域中找到a2
  10. outer() # outer()函数结束,a2作为outer局部变量被释放
  11. print(a) # a1 8, 在当前模块全局作用域中找到了a1

a1、a3是同一个变量,都是全局变量a

2、若没有在外部定义全局变量a,在局部作用域中加global关键字依然能声明一个变量为全局变量


  
  
  1. def outer():
  2. a = 9 # a2 当前outter作用域局部变量
  3. def inner():
  4. global a
  5. a = 8 # a3 既是inner局部变量,又是模块全局变量
  6. print(a) # a3 8 在inner的局部作用域中找到了a3
  7. inner() # inner()函数结束,a3作为全局变量被保留下来
  8. print(a) # a2 9,在outer局部作用域中找到a2
  9. outer() # outer()函数结束,a2作为outer局部变量被释放
  10. print(a) # a3 8在当前模块全局作用域中找到了a3

3、outer()没有局部变量a,则往上使用全局变量a


  
  
  1. def outer():
  2. def inner():
  3. global a
  4. a = 8 # a3 既是inner局部变量,又是模块全局变量
  5. print(a) # a3 8,在inner的局部作用域中找到了a3
  6. inner() # inner()函数结束,a3作为inner局部变量被释放
  7. print(a) # a3 9,在outer局部作用域中没找到a,往上在全局作用域中找到了全局变量a3
  8. outer() # outer()函数结束,a2作为outer局部变量被释放
  9. print(a) # a3 8,在当前模块全局作用域中找到了a3

三、nonlocal关键字:声明此变量与外层同名变量为相同变量

1、用于在内层函数中改变外层函数变量


  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer():
  3. a = 9 # a2 outer局部变量
  4. def inner():
  5. nonlocal a
  6. a = 8 # a3 既是inner局部变量,又是外层outer局部变量
  7. print(a) # a3 8,在inner的局部作用域中找到了a3
  8. inner() # inner()函数结束,a3作为外层变量(outer局部变量)被保留成为a2
  9. print(a) # a2 8,在outer局部作用域中找到a2(在inner中被改变)
  10. outer() # outer()函数结束,a2作为outer局部变量被释放
  11. print(a) # a1 10,在当前模块全局作用域中找到了a1

a2、a3为同一变量

2、注意:如果在外层没有找到变量a,则会继续在再外层寻找,直到全局作用域的下一层为止(看第3点)


  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer2():
  3. a = 9 # a2 outer2作用域局部变量
  4. print(a) # a2 9,还未被a3改变
  5. def outer1():
  6. print(a) # a2 9,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(还未被a3改变)
  7. def inner():
  8. nonlocal a
  9. a = 0 # a3 既是inner局部变量,又是再外层outer2作用域变量
  10. print(a) # a3 0, 找到inner局部变量a3
  11. inner() # inner()函数结束,a3作为外层变量(outer2局部变量)被保留成为a2
  12. print(a) # a2 0,在outer1中没找到局部变量a,则寻找外层(outer2)变量a2(被a3改变)
  13. outer1()
  14. print(a) # a2 0, 在outer1中找到outer1局部变量a2(被a3改变)
  15. outer2()
  16. print(a) # a1 10,在当前模块全局作用域中找到了a1
3、全局变量不是外层变量,不被nonlocal寻找

  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer():
  3. def inner():
  4. nonlocal a # 在当前作用域外层即outer局部作用域中没找到outer局部变量a,outer外层为全局作用域,nonlocal不继续寻找,报错
  5. a = 8
  6. print(a)
  7. inner()
  8. print(a)
  9. outer()
  10. print(a) # a1 10,在当前模块全局作用域中找到了a1

报错:



  
  
  1. a = 10 # a1 当前模块全局变量
  2. def outer2():
  3. nonlocal a # outer2下一层为全局作用域,nonlocal不寻找全局变量,报错
  4. a = 8
  5. outer2()
  6. print(a) # a1 10,在当前模块全局作用域中找到了a1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值