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
当函数中存在一个 变量 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
def testgloba4():
global _my_global
_my_global = "I'm a global variable from testglobal4()"
Print _my_global