圖解python全域性變數與區域性變數相關知識
這篇文章主要介紹了圖解python全域性變數與區域性變數相關知識,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
瞭解全域性變數和區域性變數之前,我們先來了解一下作用域
a = 10 def func(): b = 20 def inner(): c = 30
以上面這個程式為例:列印a,b,c
可以看到只有a列印 10 ,b和c都報錯,這就是作用域的問題。
我們把新建立的一個.py檔案看做事一個模組,在模組內定義的變數,如a,就是這個模組的全域性變數,作用於全域性,不論在哪都可以呼叫,
但是b和c 是定義在函式內部的,我們叫做區域性變數,只能作用在函式內部。
我們在看一個問題
func和inner函式可以呼叫變數a 麼?
func函式可以呼叫變數c麼?
答案是:a是全域性變數,可以在任意地方呼叫
但是func函式不可以呼叫c,這時候我們把func看做一個整體,那麼inner就是在func內部定義的函式,c也就是inner內部的變數
總結:變數定義在全域性可以在任何地方呼叫,定義在函式內部,只能在函式內使用。
變數查詢順序:LEGB
區域性作用域>外層作用域>當前模組中全域性>python內建作用域;
在來說關於全域性和區域性變數的兩個兩個方法:global,nonlocal。
直接上例子吧:
我們可以看到,區域性定義了a,那麼我們直接呼叫a就會報錯,
只有在定義後呼叫才會列印,並且全域性變數的a值不會改變
如果我現在想在區域性名稱空間改變a的值該怎麼做呢?這時候就要用到global了
我們可以看到,全域性變數a的值已經修改成15了。
下面來說nonlocal:
我們看到這時候列印a、b的時候出錯了,錯誤提示是沒有定義b
但是a沒有報錯,這是因為a是全域性變數,而b是區域性變數,所以出現了這種錯誤,改正如下:
因為b是區域性變數,所以呼叫之前用nonlocal宣告,之後就可以呼叫了。
名稱空間
名稱空間分類
全域性名稱空間( Global):每個模組載入執行時建立的,記錄了模組中定義的變數,包括模組中定義的函式、類、其他匯入的模組、模組級的變數與常量。
區域性名稱空間(Local):每個函式所擁有的名稱空間,記錄了函式中定義的所有變數,包括函式的入參、內部定義的區域性變數。
內建名稱空間(Built-in):任何模組均可以訪問,放著內建的函式和異常(比如:input,print,str,list,tuple...)。
名稱空間的載入順序
內建名稱空間(程式執行前載入) 一> 全域性名稱空間(程式執行中:從上到下載入) 一> 區域性名稱空間(程式執行中:呼叫時才載入)
名稱空間的取值順序
在區域性呼叫:區域性名稱空間 一> 全域性名稱空間 一> 內建名稱空間
在全域性呼叫:全域性名稱空間 一> 內建名稱空間
綜上所述,在尋找變數時,從小範圍,一層一層到大範圍去找尋。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。