-1

出于某种原因,Python-2.7timeit函数在以下示例中崩溃:

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

4

1 回答 1

3

timeit实际上是一个函数,但是一些 python 解释器可以让你用一个语句的语法来使用它,比如IPython, 但它实际上是一个函数。

因此,a==a+b它实际上将aandb视为全局变量,因此没有错误,因为它可以获取全局aand b

但是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
于 2012-12-20T14:32:35.327 回答