如何解决为什么会出现NameError:未定义全局名称'phase'
我正在尝试向绘图添加一些交互性,也就是说,单击鼠标左键应删除绘图中的数据点,而单击鼠标右键应以相反的顺序恢复删除的数据点。这是我的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])
NameError: global name 'phase' is not defined
我不明白为什么未定义?我究竟做错了什么?有人可以帮我吗?
这个可运行的测试脚本运行良好,但是:
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:",np.take(x,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,picker=10)
fig.canvas.mpl_connect('pick_event',pick_handler)
fig.canvas.mpl_connect('button_press_event',click_handler)
plt.show()
顺便说一句,如果我理解正确的话,如果我在函数调用过程中简单地通过phase
,那么我应该可以使用没有全局变量的全部内容,但是我不知道如何正确地做到这一点。情况。
解决方法
您正在运行Python 3吗?尝试使用nonlocal phase
代替global phase
。
问题在于您对phase
的定义不是“全局”的,而是在我周围的函数定义中定义的。 global
并不意味着“在我以外的地方定义”。它的真正含义是“在全局范围内定义”。
或者,您可以将global phase
添加到plot_folded_light_curve
中。这在Python2和Python3中都适用。它强制所有相的出现都是全局的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。