2010-09-30 29 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