2012-12-20 94 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很高兴帮助。 –