1. 程式人生 > 程式設計 >圖解python全域性變數與區域性變數相關知識

圖解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...)。

名稱空間的載入順序

內建名稱空間(程式執行前載入) 一> 全域性名稱空間(程式執行中:從上到下載入) 一> 區域性名稱空間(程式執行中:呼叫時才載入)

名稱空間的取值順序

在區域性呼叫:區域性名稱空間 一> 全域性名稱空間 一> 內建名稱空間

在全域性呼叫:全域性名稱空間 一> 內建名稱空間

綜上所述,在尋找變數時,從小範圍,一層一層到大範圍去找尋。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。