先來看一個示例:
def f1(a):
logging.info('a -> %s', a)
logging.info('b -> %s', b)
logging.info('f1(3) -> %s',f1(3))
運行結果:

因為 b 沒有定義,所以在運行 f1() 函數(shù)時拋錯了。
在 pycharm 中也會以紅色波浪形式提示我們這個變量還未定義:

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

輸出結果:

因為我們沒有為 f1() 函數(shù)定義返回值,所以f1() 函數(shù)的輸出為 None。
我們在 f1() 函數(shù)內(nèi)部對 b 進行賦值操作,結果令人意外:

輸出結果:

pycharm 也以紅色波浪線提醒我們這里的 b 變量存在問題。
通過 dis 模塊,我們可以查看 Python 函數(shù)的字節(jié)編碼:
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.