2010-09-30 33 views
1

这是我第一次使用matplotlib和numpy。Python:numpy和matplotlib异常

这里去的问题:

如果我转到蟒蛇CLI,预期代码工作正常。下面是代码

>>> from numpy import * 
>>> y = array([1,2]) 
>>> y = append(y, y[len(y) - 1]+1) 
>>> y 
array([1, 2, 3]) 

但是,如果我在一个脚本matplotlib使用它,我得到这个错误。

line 26, in onkeypress 
y = append(y, y[len(y) - 1]+1) 
UnboundLocalError: local variable 'y' referenced before assignment 

这里是我的脚本:

from matplotlib.pyplot import figure, show 
from numpy import * 
figzoom = figure() 
axzoom = figzoom.add_subplot(111, xlim=(0,10), ylim=(0, 10),autoscale_on=True) 
x = array([1, 2 ]) 
y = array([1, 10 ]) 
def onkeypress(event): 
    if event.key == "up": 
     y = append(y, y[len(y) - 1]+1) 
     x = append(x, x[len(x) - 1] ) 
     axzoom.plot(x,y) 

我试过 “追加” 荷兰国际集团到不同的阵列,说Y1,然后Y = y1.copy()。但我仍然得到同样的错误。我必须在这里错过一些微不足道的东西!

回答

3

当你分配给一个函数内的变量时,python会创建一个新的变量,它具有局部范围,而这个新变量也隐藏了全局变量。

因此,onkeypress中的x和y对于函数是局部的。因此,从Python的角度来看,它们是未初始化的,因此也是错误的。

正如GWW指出的那样 - 将x,y表示为全局将解决问题。此外,如果您不分配x,y任何新值,但仅使用先前存在的值,那么这些值将引用全局x,y。

+0

因此,通过相同的逻辑“axzoom”也应该是全球性的......礼仪? – 2010-10-02 03:51:14

+1

它不必声明为全局。由于本地范围没有axzoom变量,因此使用全局值。分配给变量是不同的,因为它在本地范围内创建了一个新变量。 – 2010-10-02 06:51:16

+0

@ future.open - 我的答案中的关键词是“当你分配”和“如果你不分配”。由于axzoom没有被分配一个值,但它的值正在被使用,它仍然指向全局变量。 – Rajan 2010-10-03 22:16:00

2

如果你改变的变量全球

def onkeypress(event): 
    global y, x 
    ... 
2

除非你有global yonkeypress()功能可能正常工作,y你分配给在本地范围的功能。您不能在您定义局部变量的赋值语句的右侧使用y