【问题标题】:python-2.7 timeit function crashespython-2.7 timeit 函数崩溃
【发布时间】:2012-12-20 14:27:03
【问题描述】:

由于某种原因,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(第一个示例),我可以将a 与a+b(第二个示例)进行比较,那么为什么我不能运行第三个示例?!?!当然,被计时的语句本身是完美的......

【问题讨论】:

  • 你到底是怎么用timeit的?
  • 这是无效的 Python 代码。
  • @Roman 这是我使用的完全相同的代码(在命令行上)
  • 不,你没有。 timeit 是一个函数,而不是一个语句。
  • @Fabian 您能否详细说明为什么它无效? timeit 和 a=a+b 都是有效的,那么为什么不组合呢?

标签: python crash ipython timeit


【解决方案1】:

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

所以在a==a+b 中,它实际上将a 和b 视为全局变量,因此没有错误,因为它可以获取全局a 和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

【讨论】:

  • 感谢 Ashwini,您刚刚教会了我对函数、语句和局部/全局变量的一些基本理解......
  • @RolfBartstra 很高兴有帮助。
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2018-12-25
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
相关资源
最近更新 更多