2016-07-27 106 views
1

當我執行爲什麼我在第二個代碼中得到UnboundLocalError,但不是在第一個代碼中?

x = 0 

def f(): 
    print('x' in locals()) 
    x = 1 
    print('x' in locals()) 

f() 

我得到了我希望,即

False 
True 

然而,當我執行

x = 3 

def f(): 
    print(x, 'x' in locals()) 
    x = 7 
    print(x, 'x' in locals()) 

f() 

我希望得到

3 False 
7 True 

但相反,我得到了UnboundLocalError

如果Python知道在下一行有本地作用域中標籤x的分配(因此名稱x已經在本地作用域中,但它尚未分配),那麼爲什麼它會讓我在我的第一個代碼中詢問x

新增

爲什麼會引發錯誤,即使x = 7來自第一print(x, 'x' in locals())後?

+0

只是在FYI這裏,但不要在實際代碼中使用'locals()'。或'globals()'。或'eval()'。或'exec()'。 – TigerhawkT3

+1

第一次搜索'locals()'中的字符'「x」'。第二個函數試圖使用變量'x'然後賦值給它。如果您想使用全局版本,請指定'global x'。見http://stackoverflow.com/questions/370357/python-variable-scope-error – cdarke

+0

@ TigerhawkT3:謝謝。我只是在嘗試學習時使用它。 – Leo

回答

0

錯誤來自打印x,而不是來自'x' in locals()。當你做'x' in locals()時,你實際上沒有對變量x做任何事情,因爲你給它一個字符串值,而不是對變量的引用。

2

dis.dis用於第一功能:

2   0 LOAD_CONST    1 ('x') 
       3 LOAD_GLOBAL    0 (locals) 
       6 CALL_FUNCTION   0 
       9 COMPARE_OP    6 (in) 
      12 PRINT_ITEM 
      13 PRINT_NEWLINE 

    3   14 LOAD_CONST    2 (1) 
      17 STORE_FAST    0 (x) 

    4   20 LOAD_CONST    1 ('x') 
      23 LOAD_GLOBAL    0 (locals) 
      26 CALL_FUNCTION   0 
      29 COMPARE_OP    6 (in) 
      32 PRINT_ITEM 
      33 PRINT_NEWLINE 
      34 LOAD_CONST    0 (None) 
      37 RETURN_VALUE 

dis.dis爲第二功能:

2   0 LOAD_FAST    0 (x) 
       3 LOAD_CONST    1 ('x') 
       6 LOAD_GLOBAL    0 (locals) 
       9 CALL_FUNCTION   0 
      12 COMPARE_OP    6 (in) 
      15 BUILD_TUPLE    2 
      18 PRINT_ITEM 
      19 PRINT_NEWLINE 

    3   20 LOAD_CONST    2 (7) 
      23 STORE_FAST    0 (x) 

    4   26 LOAD_FAST    0 (x) 
      29 LOAD_CONST    1 ('x') 
      32 LOAD_GLOBAL    0 (locals) 
      35 CALL_FUNCTION   0 
      38 COMPARE_OP    6 (in) 
      41 BUILD_TUPLE    2 
      44 PRINT_ITEM 
      45 PRINT_NEWLINE 
      46 LOAD_CONST    0 (None) 
      49 RETURN_VALUE 

臨界差是線:4 26 LOAD_FAST 0 (x)

基本上,在當前範圍內有一個名爲x的賦值語句,因此x被解析爲本地名稱。解析在編譯階段執行。編譯的字節碼使用LOAD_FAST而不是LOAD_GLOBAL

編譯成字節碼和執行是two independent steps - 語言實際上並不是逐行解釋的。

相關問題