1. 程式人生 > >Python基礎 7 函式 名稱空間

Python基礎 7 函式 名稱空間

 

Python的名稱空間的本質是一個字典,用來記錄變數名稱和值。字典的key是變數的名稱,字典的value對於的是變數的值。

例如 {name:zs,age:10}

名稱空間一共分為三種:區域性名稱空間全域性名稱空間內建名稱空間

區域性空間:

         每個函式都有自己的名稱空間,叫做區域性空間,它記錄了函式的變數,包括函式的引數 和區域性定義的變數

全域性空間:

         每個模組擁有他自己的名稱空間,叫做全域性名稱空間,他記錄了模組的變數,包括函式、類、其他匯入的模組

內建名稱空間:

          任何模組都可以訪問他,他存放著內建的函式和異常

          input   print  str   list   tuple

名稱空間的訪問

區域性名稱空間使用   locals()函式來訪問

全域性名稱空間的訪問使用   globals()函式訪問


def func(name,age):
    num = 10
    ret = locals()  #區域性名稱空間
    print(ret)      #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')

a = 10
def func(name,age):
    num = 10
    ret = locals()  #區域性名稱空間
    print(ret)      #{'age': '10', 'name': 'zs', 'num': 10}
func('zs','10')
ret = globals()     #獲取全域性變數
print(ret)


{'age': '10', 'name': 'zs', 'num': 10}
{'__spec__': None, '__name__': '__main__', 'ret': {...}, '__cached__': None, '__file__': 'D:/Pythonworkspace/day08/demo1.py', 'func': <function func at 0x00000000011867B8>, '__doc__': '\n名稱空間\n', 'a': 10, '__builtins__': <module 'builtins' (built-in)>, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000FA8AC8>}

裡面有很多內建變數名稱

2名稱空間的載入順序

內建名稱空間(程式執行前載入)------>>>

全域性名稱空間(程式執行中:從上到下載入)---------->>>

區域性名稱空間(程式執行中:呼叫時才載入)當函式返回結果或丟擲異常時,被刪除。每一個遞迴呼叫的函式都用自己的名稱空間

3 名稱空間的查詢順序

當使用某個變數的時候,先從區域性名稱空間中找,如果能找到則停止搜尋,如果找不到在去全域性名稱空間中查詢,如果找到則停止搜尋,如果找不到則到內建名稱空間中查詢,如果找不到則報錯。

id= 10
def func():
    id = 20
    print(id)      20
func()
print(id)          10
  查詢順序   區域性   全域性   內建
  如果先從區域性名稱空間中查詢到   則停止搜尋,一次向下進行查詢,做後如果查不到就報錯
  如果一開始就在全域性空間中查詢 ,找不到就去內建空間中去查詢  ,找到就列印,找不到就報錯

巢狀函式的情況:

     1、先在當前 (巢狀的或 lambda) 函式的名稱空間中搜索

     2、然後是在父函式的名稱空間中搜索

     3、接著是模組名稱空間中搜索

     4、最後在內建名稱空間中搜索

id = 10
def outter():
    id = 11
    def inner():
        id = 12
        print(id)   #12
    inner()
outter()