在 Python 中,名字是一個字符串對象,它與它指向的對象構成一個{name:object}關聯。
也能夠把一個namespace理解爲一個字典。python
Python 中name-object的關聯存儲在不一樣的做用域中,各個不一樣的做用域是相互獨立的。
而咱們就在不一樣的做用域中搜索name-object。
Python中使用變量名引用對象,須要使用該變量時,就在命名空間中進行搜索,獲取對應的對象。
名稱空間有四種:LEGB閉包
當程序引用某個變量的名字時,就會從當前名字空間開始查找,查找順序(LEGB):
locals -> enclosing function -> globals -> builtins函數
1.__builtins__ 在python解釋器啓動的時候,便已經建立,直到退出。
2.globals 在模塊定義被讀入時建立,一般也一直保存到解釋器退出。
3.locals 在函數調用時建立,直到函數返回,或者拋出異常以後,銷燬。
4.遞歸函數每一次均有本身的名字空間。ui
print('1. globals: ', globals()) # 全局名稱空間,此時不包含a a = 1000000000 # 定義全局變量a def func(): print('1. func locals: ', locals()) # 此時函數內的名稱空間爲空 a = 1 # 局部變量a b = 2 global p # 函數內部調用global聲明的時候,可將變量存儲在globals中 p = 9999 def inner_func(): print('1. inner_func locals: ', locals()) # 此處locals中已經有了nonlocal聲明的a,且此時的a爲外部嵌套函數裏的值 m = 3 n = 4 nonlocal a # nonlocal關鍵字來修改外部嵌套函數的名字空間。只能在內部嵌套函數使用。 a = m + n print(a) print('2. inner_func locals: ', locals()) inner_func() print(a, b, p) print('2. func locals: ', locals()) func() print(a) print('2. globals: ', globals())
''' 1. globals: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000178D6FD64A8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/新建文件夾/practice2.py', '__cached__': None} 1. func locals: {} 1. inner_func locals: {'a': 1} 7 2. inner_func locals: {'a': 7, 'm': 3, 'n': 4} 7 2 9999 2. func locals: {'b': 2, 'inner_func': <function func.<locals>.inner_func at 0x00000178D8C2A6A8>, 'a': 7} 1000000000 2. globals: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000178D6FD64A8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/新建文件夾/practice2.py', '__cached__': None, 'a': 1000000000, 'func': <function func at 0x00000178D6F8C268>, 'p': 9999} '''