2012-12-20 141 views
-1

出於某種原因,Python的-2.7在下面的例子中timeit功能崩潰:蟒-2.7 timeit功能崩潰

a,b = 0,0 
timeit a=b     # ok: 10000000 loops, best of 3: 50.9 ns per loop 
timeit if a==a+b: pass  # ok: 1000000 loops, best of 3: 129 ns per loop 
timeit a=a+b    # crashes! 

Traceback (most recent call last): 
UnboundLocalError: local variable 'a' referenced before assignment 

顯然,我可以將分配給a(第一實例),我可以比較aa+b (第二個例子),爲什麼我不能運行第三個例子?!?!當然,被計時的說法是,其本身完美的聲音......

+0

你究竟有使用'timeit'? –

+2

這是無效的Python代碼。 – Fabian

+0

@羅曼這是我使用的完全相同的代碼(在命令行上) –

回答

3

timeit實際上是一個功能,而有些Python解釋可以讓你用聲明的語法使用它,就像IPython,但它實際上是一個功能。

所以a==a+b它實際上認爲ab爲全局變量,因此沒有錯誤,因爲它可以獲取全球ab

a=a+b它認爲a爲局部變量和b仍然是全球所以它會引發錯誤,因爲只要Python看到它認爲它作爲一個局部變量的函數內部分配。

它相當於:

In [7]: def func1(): 
    a==a+b 
    ...:  

In [8]: def func(): 
    a=a+b 
    ...:  

In [9]: dis.dis(func1) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 LOAD_GLOBAL    0 (a) 
       6 LOAD_GLOBAL    1 (b) 
       9 BINARY_ADD   
      10 COMPARE_OP    2 (==) 
      13 POP_TOP    
      14 LOAD_CONST    0 (None) 
      17 RETURN_VALUE   

In [10]: dis.dis(func) 
    2   0 LOAD_FAST    0 (a) # but there's nothing to load, so Error 
       3 LOAD_GLOBAL    0 (b) 
       6 BINARY_ADD   
       7 STORE_FAST    0 (a) 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE   


In [11]: func()  #same error as yours 
--------------------------------------------------------------------------- 
UnboundLocalError       Traceback (most recent call last) 

UnboundLocalError: local variable 'a' referenced before assignment 
+0

謝謝Ashwini,你剛剛教會了我對函數,陳述和本地/全局變量的基本理解...... –

+0

@RolfBartstra很高興幫助。 –