Python-2.7 TimeIt功能崩溃



出于某种原因,python-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(第二个示例)进行比较,那么为什么我不能运行第三个示例?!?!?!当然,定时的说法本身就是完美的声音...

timeit实际上是一个函数,但是一些python口译员可以允许您将其与 statement 的语法(如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

相关内容

  • 没有找到相关文章

最新更新