Python自由之路(四)变量作用域

Python中,在一个函数里,当搜索一个标识符的时候,先从函数你的局部变量开始搜索,如果局部作用域没有,再到模块所在的命名空间下的全局域找,再找不到就抛出NameError异常。一个变量的作用域与它寄住的名称空间有关(下面会讨论到)。
 当函数中存在一个 变量 example,而全局域中也存在一个变量example,那么这时候规则会变得很有趣。但也很容易弄错。来看几个例子吧。。。
 _global="I'm a global variable"
 def testgloba1(): 
     print _global
 def testgloba2():
     print _global
      _global='123'
Testglobal2()异常:UnboundLocalError: local variable '_global' referenced before assignment
当在函数中创建了与全局域中同名的局部变量_global时,需要特别注意在_global之前是否又引用了同名的全局变量_global,如果是这样就会引发变量未声明的异常,接下来看看解释器怎样解决这个问题,我们引入了global关键字,在函数内部直接传递全局变量的引用:
 print _global ,id(_global)
def testgloba3():
  global _global   #1.直到再次声明同名变量_global之前的所有_global
      print _global,id(_global) #2.都是对全局变量_global的引用
      _global='123' 
      print _global,id(_global)
如果在#2之后还要对全局变量进行访问,那么最好就是在#1之后为全局_global定义一个新的别名。
注意:局部同名变量不能在global关键字之前使用,否则会有警告,而且结果也不正确。
 print _global ,id(_global)
def testgloba3():
  _global='123' 
      print _global,id(_global)
  global _global   #SyntaxWarning
      print _global,id(_global)
SyntaxWarning: name '_global' is assigned to before global declaration
Global关键字的还有一个作用就是在函数内部可以声明全局域的变量,看例子:
def testgloba4():
  global _my_global
  _my_global = "I'm a global variable from testglobal4()"
 Print _my_global
原文地址:https://www.cnblogs.com/ysisl/p/1548072.html