Python命名空间的本质(转自http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html)
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间
重点是第四部分,我们将在此部分观察命名空间的内容。
一、命名空间
1 info = "Adress : " 2 def func_father(country): 3 def func_son(area): 4 city= "Shanghai " #此处的city变量,覆盖了父函数的city变量 5 print(info + country + city + area) 6 city = " Beijing " 7 #调用内部函数 8 func_son("ChaoYang "); 9 10 func_father("China ")
输出:Adress : China Shanghai ChaoYang
i=1 def func2(): i=i+1 func2(); #错误:UnboundLocalError: local variable 'i' referenced before assignment
由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。
def func3(): y=123 del y print(y) func3() #错误:UnboundLocalError: local variable 'y' referenced before assignment #去掉"del y"语句后,运行正常
四、命名空间的访问
def func1(i, str ): x = 12345 print(locals()) func1(1 , "first")
输出:{'str': 'first', 'x': 12345, 'i': 1}
'''Created on 2013-5-26''' import copy from copy import deepcopy gstr = "global string" def func1(i, info): x = 12345 print(locals()) func1(1 , "first") if __name__ == "__main__": print("the current scope's global variables:") dictionary=globals() print(dictionary)
输出:(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)
def func1(i, info): x = 12345 print(locals()) locals()["x"]= 6789 print("x=",x) y=54321 func1(1 , "first") globals()["y"]= 9876 print( "y=",y)
输出:
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间
重点是第四部分,我们将在此部分观察命名空间的内容。
一、命名空间
1 info = "Adress : " 2 def func_father(country): 3 def func_son(area): 4 city= "Shanghai " #此处的city变量,覆盖了父函数的city变量 5 print(info + country + city + area) 6 city = " Beijing " 7 #调用内部函数 8 func_son("ChaoYang "); 9 10 func_father("China ")
输出:Adress : China Shanghai ChaoYang
i=1 def func2(): i=i+1 func2(); #错误:UnboundLocalError: local variable 'i' referenced before assignment
由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。
def func3(): y=123 del y print(y) func3() #错误:UnboundLocalError: local variable 'y' referenced before assignment #去掉"del y"语句后,运行正常
四、命名空间的访问
def func1(i, str ): x = 12345 print(locals()) func1(1 , "first")
输出:{'str': 'first', 'x': 12345, 'i': 1}
'''Created on 2013-5-26''' import copy from copy import deepcopy gstr = "global string" def func1(i, info): x = 12345 print(locals()) func1(1 , "first") if __name__ == "__main__": print("the current scope's global variables:") dictionary=globals() print(dictionary)
输出:(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)
def func1(i, info): x = 12345 print(locals()) locals()["x"]= 6789 print("x=",x) y=54321 func1(1 , "first") globals()["y"]= 9876 print( "y=",y)
输出: