亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python變量范圍錯誤

Python變量范圍錯誤

Python變量范圍錯誤以下代碼在Python 2.5和3.0中按預期工作:a, b, c = (1, 2, 3)print(a, b, c)def test():     print(a)     print(b)     print(c)    # (A)     #c+=1       # (B)test()但是,當我取消注釋行(B)時,我得到了UnboundLocalError: 'c' not assigned一行(A)。的值a和b被正確地打印。這讓我感到困惑,原因有兩個:為什么在行(A)處拋出運行時錯誤,因為后面的行(B)語句?為什么變量a和b打印符合預期,同時c引發錯誤?我能想到的唯一解釋是,賦值創建了一個局部變量,即使在創建局部變量之前,它也優先于“全局”變量。當然,變量在存在之前“竊取”范圍是沒有意義的。cc+=1c有人可以解釋一下這種行為嗎?
查看完整描述

3 回答

?
jeck貓

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中并打印它”,當它檢測到該變量仍然未初始化時,引發異常。


查看完整回答
反對 回復 2019-05-27
  • 3 回答
  • 0 關注
  • 824 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號