3 回答

TA貢獻1909條經驗 獲得超7個贊
看一下反匯編可能會澄清發生了什么:
>>> def f():
... print a
... print b
... a = 1
>>> import dis
>>> dis.dis(f)
2 0 LOAD_FAST 0 (a)
3 PRINT_ITEM
4 PRINT_NEWLINE
3 5 LOAD_GLOBAL 0 (b)
8 PRINT_ITEM
9 PRINT_NEWLINE
4 10 LOAD_CONST 1 (1)
13 STORE_FAST 0 (a)
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
如您所見,用于訪問a的字節碼是LOAD_FAST和b LOAD_GLOBAL。這是因為編譯器已經識別出在函數內分配了a,并將其歸類為局部變量。本地化的訪問機制對于全局變量是根本不同的 - 它們在幀的變量表中靜態分配了一個偏移量,這意味著查找是一個快速索引,而不是像全局變量那樣更昂貴的dict查找。正因為如此,Python正在讀取該print a行“獲取局部變量的值'a'保存在插槽0中并打印它”,當它檢測到該變量仍然未初始化時,引發異常。
添加回答
舉報