【问题标题】:Python: numpy and matplotlib anomalyPython:numpy 和 matplotlib 异常
【发布时间】:2010-09-30 18:36:37
【问题描述】:

这是我第一次使用 matplotlib 和 numpy。

问题来了:

如果我转到 python 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()。但我仍然得到同样的错误。我一定在这里遗漏了一些微不足道的东西???!!!

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    当你在函数内部给一个变量赋值时,python会创建一个具有局部作用域的新变量,这个新变量也隐藏了全局变量。

    所以,onkeypress 中的 x 和 y 是函数的局部变量。因此,从 python 的角度来看,它们是未初始化的,因此是错误的。

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

    【讨论】:

    • 它不必被声明为全局的。由于本地范围没有 axzoom 变量,因此使用全局值。分配给变量是不同的,因为它会在本地范围内创建一个新变量。
    • @future.open - 我的回答中的关键词是“当你分配”和“如果你不分配”。由于 axzoom 没有被赋值,但它的值被使用,它仍然引用全局变量。
    【解决方案2】:

    如果您将变量更改为全局变量,它可能会起作用

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

    【讨论】:

      【解决方案3】:

      除非您在您的 onkeypress() 函数中包含 global y,否则您分配给的 y 将在本地限定为该函数。您不能在定义局部变量的赋值语句右侧使用y

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 2021-12-03
        • 2013-07-17
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        相关资源
        最近更新 更多