本文介紹python中命名空間中的legb原則。
legb含**釋:
l-local(function);函式內的名字空間,包括區域性變數和形參前面講到,python的命名空間是乙個字典,字典內儲存了變數名稱與物件之間的對映關係,因此,查詢變數名就是在命名空間字典中查詢鍵-值對。e-enclosing function locals;外部巢狀函式的名字空間(例如closure)
g-global(module);函式定義所在模組(檔案)的名字空間
b-builtin(python);python內建模組的名字空間
legb規定了查詢乙個名稱的順序為:
local–>enclosing function locals–>global–>builtin在上述兩個例子中,從內到外,依次形成四個命名空間:
def innerfoo()::local, 即函式內部命名空間;
def foo()::enclosing function locals;外部巢狀函式的名字空間
module(檔案本身):global(module);函式定義所在模組(檔案)的名字空間
python內建模組的名字空間:builtin
一段**理解leg
x = 1
deffoo
(): x = 2
definnerfoo
(): x = 3
print
'locals ', x
innerfoo()
print
'enclosing function locals ', x
foo()
print
'global ', x
執行結果:
locals 2可以發現:當注釋掉x = 3以後,函式innerfoo內部查詢到的x是x = 2。enclosing function locals 2
global 1
在上述兩個例子中,從內到外,依次形成四個命名空間:
def innerfoo()::local, 即函式內部命名空間;
def foo()::enclosing function locals;外部巢狀函式的名字空間
module(檔案本身):global(module);函式定義所在模組(檔案)的名字空間
python內建模組的名字空間:builtin
x = 3 屬於函式內部命名空間,當被注釋掉之後,函式innerfoo內部通過print x 使用x這個名稱時,觸發了名稱查詢動作。
首先在local命名空間查詢,沒有找到,然後到enclosing function locals命名空間查詢,查詢成功,然後呼叫。
``` python
x=11
#模組級
deff
():print x
defg
(): x=22
print x
class
c: x=33
defm
(self):
x=44
print x
self.x=55
if __name__=='__main__':
print x
f()g()
print x
obj=c()
print obj.x
obj.m()
print obj.x
print c.x
輸出結果:
1111
2211
3344
5533
1111
2211
3344
5533
otherfile.py
import manynames
x = 66
print x #66
print manynames.x #11
manynames.f() #11
manynames.g() #22
print manynames.c.x #33
i=manynames.c()
print i.x #33
i.m()
print i.x #55
輸出結果
6611
1122
3333
4455
鏈結位址如下: python 命名空間
作用域 第五章說過,將輸入字元作為命令放在作用域字典裡 作用域,每個函式都有乙個作用域,就是 字典,字典名字為函式名,鍵為變數,鍵值為變數對應的賦值。函式的作用域為區域性作用域 在函式內部訪問全域性變數,且只是讀取變數的值不重新繫結變數。這樣引用易出錯誤。慎重使用全域性變數 defcombine p...
python命名空間
區域性命名空間下def foo a a if name main foo 報錯資訊 unboundlocalerror local variable a referenced before assignment 全域性命名空間下if name main b b報錯資訊 nameerror name ...
python命名空間
變數是擁有匹配物件的名字 識別符號 命名空間是乙個包含了變數名稱們 鍵 和它們各自相應的物件們 值 的字典。乙個 python 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。每個函式都有自己的命名空間。類的方法的作用域規則...