3 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
看一下反匯編可能會(huì)澄清發(fā)生了什么:
>>> 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
如您所見,用于訪問(wèn)a的字節(jié)碼是LOAD_FAST和b LOAD_GLOBAL。這是因?yàn)榫幾g器已經(jīng)識(shí)別出在函數(shù)內(nèi)分配了a,并將其歸類為局部變量。本地化的訪問(wèn)機(jī)制對(duì)于全局變量是根本不同的 - 它們?cè)趲淖兞勘碇徐o態(tài)分配了一個(gè)偏移量,這意味著查找是一個(gè)快速索引,而不是像全局變量那樣更昂貴的dict查找。正因?yàn)槿绱耍琍ython正在讀取該print a行“獲取局部變量的值'a'保存在插槽0中并打印它”,當(dāng)它檢測(cè)到該變量仍然未初始化時(shí),引發(fā)異常。
添加回答
舉報(bào)