1. 程式人生 > 實用技巧 >Python名稱空間和作用域

Python名稱空間和作用域

Python名稱空間和作用域

總結

emmm,這一塊講了2個內容,一個是名稱空間,一個是作用域。一個一個說吧

名稱空間

A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries

上邊這段是官方文件定義的,簡單來說就是名字到物件的對映,我們知道,python的一切都是物件,你所定義的變數名其實只是個引用。這樣就好理解了。python的名稱空間由python資料結構字典實現。
python的名稱空間細分的話有三種。如圖所示。

這一部分沒什麼好說的,重要的是理解其概念

作用域

A scope is a textual region of a Python program where a namespace is directly accessible. "Directly accessible" here means that an unqualified reference to a name attempts to find the name in the namespace.

由官方文件可以看出,作用域就是可以直接訪問的區域。就是全域性到區域性。這裡舉個程式碼例子就行了。

#demo.py

global_var='haha'   #定義全域性變數

def tool():
    local_var='local'   #區域性變數
    print(local_var)    #訪問區域性變數,可以訪問

print(global_var)   #訪問全域性變數,可以訪問
print(local_var)    #訪問區域性變數,找不到,無法訪問

驚喜知識

這一部分的驚喜知識是跟作用域有關的。學到了2個關鍵字globalnonlocal

global_var='haha'   #定義全域性變數

def tool():
    global_var='22'
    print(global_var)

print(global_var)   #訪問全域性變數,可以訪問
tool()

這段程式碼輸出了2個global_var。輸出結果是不一樣的。tool函式裡在區域性修改了global_var的值,並不影響全域性。此時如果你想影響全域性,你就需要用到關鍵字global.

global_var='haha'   #定義全域性變數

def tool():
    global global_var
    global_var='22'
    print(global_var)

tool()
print(global_var) 

這樣就好了。
nonlocal作用類似,用來修改巢狀作用域的。

def tool():
    var=1
    def inner():
        nonlocal var
        var=2
        print(var)
    inner()
    print(var)
tool()