命名空間是從名稱到物件的映射,大部分的命名空間都是通過 Python 字典來實作的
命名空間查找順序:區域命名空間、全域命名空間、內置命名空間
相同的物件名稱可以存在于多個命名空間中
作用域就是一個可以直接訪問命名空間的正文區域,程式的變數并不是在哪個位置都可以訪問的,訪問權限決定于這個變數是在哪里賦值的,變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱,python的作用域共有四種:
L(Local):最內層,包含區域變數,比如一個函式/方法內部
E(Enclosing):包含了非區域也非全域的變數,比如兩個嵌套函式中間的變數
G(Global):當前腳本的最外層,比如當前模塊的全域變數
B(Built-in):包含了內建的變數/關鍵字等,最后被搜索(通過builtins標準模塊實作,要先匯入)
規則順序:L、E、G、B
python中只有模塊、類、函式才會引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)不會引入新的作用域,這些陳述句內定義的變數,外部也可以訪問
例如:
def aFunction(): a = 1 return a print(a)
結果會報錯:
print(a) NameError: name 'a' is not defined
例如:
if True: a = 1 print(a)
結果不會報錯:
1
全域變數和區域變數
定義在函式內部的變數擁有一個區域作用域,定義在函式外的擁有全域作用域
區域變數只能在其被宣告的函式內部訪問,而全域變數可以在整個程式范圍內訪問
如果想在區域作用域想修改全域作用域的變數,要使用global關鍵字:
a = 1 def changeA(): global a a = 2 print(a) changeA()
結果為:
2
可以用通過函式引數傳遞:
a = 1 def changeA(a): a = 2 print(a) changeA(a)
結果為:
2
如果想修改嵌套作用域的變數需要使用nonlocal關鍵字
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462911.html
標籤:其他
