Python3.7之namespace

Python3.7之namespace

1、namespace

在 Python 中,名字是一個字符串對象,它與它指向的對象構成一個{name:object}關聯。
也能夠把一個namespace理解爲一個字典。python

二.做用域

Python 中name-object的關聯存儲在不一樣的做用域中,各個不一樣的做用域是相互獨立的。
而咱們就在不一樣的做用域中搜索name-object。
Python中使用變量名引用對象,須要使用該變量時,就在命名空間中進行搜索,獲取對應的對象。
名稱空間有四種:LEGB閉包

  • locals 是函數內的名字空間,包括局部變量和形參
  • enclosing 在嵌套函數中外部函數的名字空間, 若fun2嵌套在fun1裏,對fun2來講,fun1的名字空間就是enclosing(閉包中常見)
  • globals 當前的模塊空間,模塊就是一些py文件。也就是說,globals()相似全局變量
  • builtins 內置模塊的名字空間,也就是內置變量或者內置函數的名字空間,print(dir(builtins))可查看包含的值

當程序引用某個變量的名字時,就會從當前名字空間開始查找,查找順序(LEGB):
locals -> enclosing function -> globals -> builtins函數

3、生命週期

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}
'''
相關文章
相關標籤/搜索