出于某种原因,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口译员可以允许您将其与 statement 的语法(如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