說說 Python 的變數作用域

2021-10-19 08:44:04 字數 1311 閱讀 8458

先來看乙個示例:

def f1(a):

logging.info('a -> %s', a)

logging.info('b -> %s', b)

logging.info('f1(3) -> %s',f1(3))

執行結果:

因為 b 沒有定義,所以在執行 f1() 函式時拋錯了。

在 pycharm 中也會以紅色波浪形式提示我們這個變數還未定義:

解決這個問題也很簡單,先定義好變數 b 即可:

輸出結果:

因為我們沒有為 f1() 函式定義返回值,所以f1() 函式的輸出為 none。

我們在 f1() 函式內部對 b 進行賦值操作,結果令人意外:

輸出結果:

pycharm 也以紅色波浪線提醒我們這裡的 b 變數存在問題。

通過 dis 模組,我們可以檢視 python 函式的位元組編碼:

from dis import dis

logging.info('dis(f1) -> %s',dis(f1))

執行結果:

從字面碼中可以看出,變數 a 與 b 都是從區域性作用域(load_fast)中載入。而變數 b 在使用前沒有被初始化,所以拋錯。

可以通過把變數 b 定義為 global,來修復上述**:

這時的變數 b 就會從全域性作用域中載入,所以執行正常:

luciano ramalho (作者),安道,吳珂 (譯者).流暢的python[m].人民郵電出版社,2017:308-311.

python變數作用域

變數作用域 scope 在python中是乙個容易掉坑的地方。什麼是作用域 作用域簡單說就是乙個變數的命名空間。中變數被賦值的位置,就決定了哪些範圍的物件可以訪問這個變數,這個範圍就是命名空間。python賦值時生成了變數名,當然作用域也包括在內。python的作用域一共有4中,分別是 l loca...

Python 變數作用域

g global defchange global g g g change print g change print g 結果 global globalchange def function g function deflocalvar g local defglobalvar global g...

變數作用域 python

python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l e g b 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會去全...