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 并不能涉及变量作用域的更改,在他们的代码块中的变量,在外部也是可以访问的.
作用域由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中导入一个模块可以理解为是将另外一个模块各变量赋值给当前模块的同名变量, 对当前模块中变量的赋值不会影响到导入模块的变量。原文:http://blog.csdn.net/iitvip/article/details/19974439
评论(0)