說說 Python 的變量作用域

先來看一個示例:

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.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容