Python 命名空間

2021-07-26 10:49:48 字數 2404 閱讀 6340

本文介紹python中命名空間中的legb原則。

legb含**釋:

l-local(function);函式內的名字空間,包括區域性變數和形參

e-enclosing function locals;外部巢狀函式的名字空間(例如closure)

g-global(module);函式定義所在模組(檔案)的名字空間

b-builtin(python);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

enclosing function locals 2

global 1

可以發現:當注釋掉x = 3以後,函式innerfoo內部查詢到的x是x = 2。

在上述兩個例子中,從內到外,依次形成四個命名空間:

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 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。每個函式都有自己的命名空間。類的方法的作用域規則...