python的作用域

时间:2014-02-27 11:49:22   收藏:0   阅读:494
在python中,变量查找遵循LGB原则,即优先在局部作用域(local scope)中对变量进行查找,失败则在全局作用域(global scope)中进行查找,最后尝试再内建作用域(build-in scope)内查找,如果还是未找到的话,则抛出异常。后来由于闭包和嵌套函数的出现,作用域又增加了外部作用域,这样变量的查找作用域优先级变为:局部、外部、全局和内建。

作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域,也就是说if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,在他们的代码块中的变量,在外部也是可以访问的.

局部作用域中不应对全局变量进行赋值

需要注意的是虽然我们可以在函数中对全局的变量进行访问,但一旦局部作用域中对全局变量进行了赋值操作,python解释器就不会从全局作用域中查找,而会抛出UnboundLocalError错误.该规则在由局部作用域向外部作用域查找时同样有效.

   #!/usr/bin/python
   #coding:utf-8
   
   def printNum():
       print "num : %d" % num#可以读取全局变量
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."

   #!/usr/bin/python
   #coding:utf-8
   
   def printNum():
       num += 5#给全局变量赋值错误
       print "num : %d" % num
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."



局部作用域中使用 global实现对全局变量进行赋值

#!/usr/bin/python
#coding:utf-8
   
   def printNum():
       global num#如果需要给全局变量赋值,加上global
       num += 5
       print "num : %d" % num
       
      
  num = 10
  
  if __name__ == "__main__":
      print "num is: %d" % num
      printNum()
  else:
      print "not in main..."



局部作用域中全局变量应是只读是不准确的

 #!/usr/bin/python
 #coding:utf-8
 
 def printNum():
     global num
     num += 5
     print "num : %d" % num
     
 def printArray():
     ary.append("hello")#可以改变全局变量
     
     global ary#如果直接赋值的话会出错,所以需要加上global
     ary = ["new array"]
     print ary
     
 num = 10
 ary = ["one"]
 
 if __name__ == "__main__":
     print "num is: %d" % num
     print "array is :",ary
     printNum()
     printArray()
 else:
     print "not in main..."


全局作用域指的是本模块而不是程序 

在变量查找时只会在本模块范围内进行变量的查找,即使使用from xxx import *也不会垮模块查找。在python中导入一个模块可以理解为是将另外一个模块各变量赋值给当前模块的同名变量, 对当前模块中变量的赋值不会影响到导入模块的变量。

python的作用域,布布扣,bubuko.com

原文:http://blog.csdn.net/iitvip/article/details/19974439

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!