标签:loader for err == ade most cache ppi 引用
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间
重点是第四部分,我们将在此部分观察命名空间的内容。
info = "Adress : " def func_father(country): def func_son(area): city = "Shanghai " # 此处的city变量,覆盖了父函数的city变量 print(info + country + city + area) city = " Beijing " # 调用内部函数 func_son("ChaoYang ") func_father("China ") # 执行结果 Adress : China Shanghai ChaoYang
以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中
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}
示例:
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)
执行结果(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)
{ ‘__name__‘: ‘__main__‘, ‘__doc__‘: ‘Created on 2013-5-26‘, ‘__package__‘: None, ‘__cached__‘: None, ‘__file__‘: ‘E:\\WorkspaceP\\Test1\\src\\base\\test1.py‘, ‘__loader__‘: <_frozen_importlib.SourceFileLoader object at 0x01C702D0>, ‘copy‘: <module ‘copy‘ from ‘D:\\Python33\\lib\\copy.py‘>, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘gstr‘: ‘global string‘, ‘dictionary‘: {...}, ‘func1‘: <function func1 at 0x01C6C540>, ‘deepcopy‘: <function deepcopy at 0x01DB28A0> }
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) # 执行结果 {‘i‘: 1, ‘x‘: 12345, ‘info‘: ‘first‘} x= 12345 y= 9876
标签:loader for err == ade most cache ppi 引用
原文地址:https://www.cnblogs.com/xiaohei001/p/9786010.html