Why do I get NameError: global name 'phase' is not defined

Why do I get NameError: global name 'phase' is not defined

我正在尝试为绘图添加一些交互性,也就是说,左键单击应删除绘图中的数据点,右击应以相反的顺序恢复已删除的数据点。这是我的 Python 脚本的相关摘录:

def plot_folded_light_curve(best_frequency, method):
    x_time = np.asarray(x_period)
    phase = (x_time * best_frequency) % 1

    fig, ax = plt.subplots(figsize=(8, 6))
    plt.subplots_adjust(left=0.25, bottom=0.25)

    blue_scatter = plt.scatter(phase, y_m0, color="blue", picker=10)

    # delete data points in the raw light curve plot by left-clicks
    def pick_handler(event):
        global phase
        if event.mouseevent.button==1:
            ind = event.ind
            print "Deleting data point:", ind[0], np.take(phase, ind[0]), np.take(y_m0, ind[0])
            deleted_phase.append(phase[ind[0]])
            phase_index.append(ind[0])
            phase = np.delete(phase, [ind[0]])
            deleted_y_m0.append(y_brightness[ind[0]])
            y_m0_index.append(ind[0])
            del y_m0[ind[0]]
            deleted_blocks_items.append(sorted(blocks[blocks.keys()[0]].items())[ind[0]])
            del blocks[blocks.keys()[0]][sorted(block)[ind[0]]]
            blue_scatter.set_offsets(phase,y_m0)
            fig.canvas.draw()

    # restore data points in the raw light curve plot by right-clicks
    def click_handler(event):
        global phase
        if event.button == 3:
            if len(deleted_phase) > 0:
                print "Restoring data point:", phase_index[-1], deleted_phase[-1], deleted_y_m0[-1]
                phase = np.insert(phase, phase_index.pop(), deleted_phase.pop())
                y_m0.insert(y_m0_index.pop(), deleted_y_m0.pop())
                blocks[blocks.keys()[0]].update([deleted_blocks_items[-1]])
                deleted_blocks_items.pop()
                blue_scatter.set_offsets(np.c_[phase,y_m0])
                fig.canvas.draw()
            else:
                print "No deleted data points left!"

    fig.canvas.mpl_connect('pick_event', pick_handler)
    fig.canvas.mpl_connect('button_press_event', click_handler)

当我 运行 脚本和调用函数 pick_handler() 时,我收到一条错误消息:

  File "/usr/local/bin/apex_geo_lightcurve.py", line 624, in pick_handler
    print "Deleting data point:", ind[0], np.take(phase, ind[0]), np.take(y_m0, ind[0])
NameError: global name 'phase' is not defined

不明白为什么没有定义?我究竟做错了什么?有人可以帮我吗?

这个 运行nable 测试脚本工作正常,但是:

import numpy as np
import matplotlib.pyplot as plt

x = np.asarray([1, 3, 5])
y = [2, 4, 6]

deleted_x = []
deleted_y = []
x_index= []
y_index= []

# delete data points in the raw light curve plot by left-clicks
def pick_handler(event):
    global x
    if event.mouseevent.button==1:
        ind = event.ind
        print ind
        print "Deleting data point:", ind[0], np.take(x, ind[0]), np.take(y, ind[0])
        deleted_x.append(x[ind[0]])
        x_index.append(ind[0])
        x = np.delete(x, [ind[0]])
        deleted_y.append(y[ind[0]])
        y_index.append(ind[0])
        del y[ind[0]]
        blue_scatter.set_offsets(np.c_[x, y])
        fig.canvas.draw()

# restore data points in the raw light curve plot by right-clicks
def click_handler(event):
    global x
    if event.button == 3:
        if len(deleted_x) > 0:
            print "Restoring data point:", x_index[-1], deleted_x[-1], deleted_y[-1]
            x = np.insert(x, x_index.pop(), deleted_x.pop())
            y.insert(y_index.pop(), deleted_y.pop())
            blue_scatter.set_offsets(np.c_[x, y])
            fig.canvas.draw()
        else:
            print "No deleted data points left!"

fig, ax = plt.subplots()
blue_scatter = plt.scatter(x, y, color="blue", picker=10)
fig.canvas.mpl_connect('pick_event', pick_handler)
fig.canvas.mpl_connect('button_press_event', click_handler)
plt.show()

顺便说一下,如果我理解正确,我应该能够在没有全局变量的情况下使用整个东西,如果我在函数调用期间简单地传递 phase,但我不知道如何正确地做到这一点在这种情况下。

你是运行Python3吗?尝试使用 nonlocal phase 而不是 global phase.

问题是您对 phase 的定义不是“全局的”,它是在我周围的函数定义中定义的。 global 并不意味着“在我之外的某个地方定义”。它的真正意思是“在全局范围内定义”。

或者,您可以将 global phase 添加到 plot_folded_light_curve。这适用于 Python2 和 Python3。它强制所有相位的出现都是全局的。