python 变量作用域

几个概念:

  • python能够改变变量作用域的代码段是def、class、lamda.
  • if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的
  • 变量搜索路径是:本地变量->全局变量
  • python能够改变变量作用域的代码段是def、class、lamda.

[python]  view plain copy print ?
  1. def scopetest():  
  2.     localvar=6;  
  3.     print(localvar)  
  4.     
  5. scopetest()  
  6. #print(localvar) #去除注释这里会报错,因为localvar是本地变量  
  • if/elif/else、try/except/finally、for/while

[python]  view plain copy print ?
  1. while True:  
  2.     newvar=8  
  3.     print(newvar)  
  4.     break;  
  5.   
  6. print(newvar)  
  7.   
  8. try:  
  9.     newlocal=7  
  10.     raise Exception  
  11. except:  
  12.     print(newlocal)#可以直接使用哦  

输出结果:8 8 7

可见这个关键字中定义变量,他们的作用域跟外部是一致的,这个跟Java的作用域概念有点不一样。

  • 变量搜索路径是:本地变量->全局变量

[python]  view plain copy print ?
  1. def scopetest():  
  2.     var=6;  
  3.     print(var)#  
  4.       
  5. var=5   
  6. print(var)  
  7. scopetest()  
  8. print(var)  

输出结果:5 6 5

这里var 首先搜索的是本地变量,scopetest()中 var=6相当于自己定义了一个局部变量,赋值为6. 当然如果的确要修改全局变量的值,则需要如下:

[python]  view plain copy print ?
  1. def scopetest():  
  2.     global var   
  3.     var=6;  
  4.     print(var)#  
  5.       
  6. var=5   
  7. print(var)  
  8. scopetest()  
  9. print(var)  
输出结果:5 6 6

再看一种这种情况:

[python]  view plain copy print ?
  1. def scopetest():  
  2.     var=6;  
  3.     print(var)#  
  4.     def innerFunc():  
  5.         print(var)#look here  
  6.     innerFunc()  
  7.       
  8. var=5   
  9. print(var)  
  10. scopetest()  
  11. print(var)  
输出结果:5 6 6 5

根据调用顺序反向搜索,先本地变量再全局变量,例如搜先在innerFunc中搜索本地变量,没有,好吧,找找调用关系上一级scopetest,发现本地变量var=6,OK,就用他了。

-------------------------------还有一种情况:

def func():
    x = 0 
    def _func():
        x += 1
        print x
    _func()
    
if __name__ == "__main__":
    func()
此时会报错:

UnboundLocalError: local variable 'x' referenced before assignment

原因是:如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为内部函数_func中没有x的定义,所以报错。


转自:python 变量作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值