python - 为什么我会收到 NameError:未定义全局名称“阶段”
问题描述
我正在尝试为绘图添加一些交互性,也就是说,左键单击应该删除绘图中的一个数据点,而右键单击应该以相反的顺序恢复已删除的数据点。这是我的 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
我不明白为什么它没有定义?我究竟做错了什么?有人可以帮我吗?
不过,这个可运行的测试脚本运行良好:
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
在函数调用期间通过,但我不知道在这种情况下如何正确地做到这一点。
解决方案
你在运行 Python 3 吗?尝试使用nonlocal phase
而不是global phase
.
问题是您的定义phase
不是“全局的”,它是在恰好围绕着我的函数定义中定义的。 global
并不意味着“在我之外的某个地方定义”。它的真正意思是“在全局范围内定义”。
或者,您可以添加global phase
到plot_folded_light_curve
. 这适用于 Python2 和 Python3。它强制所有相位的出现都是全局的。
推荐阅读
- c++ - 优化在堆上创建的冗余变量
- python - 像交互式运行一样运行 python 脚本
- javascript - Pusher:在 App\Events\Event 的 testChannel 上没有回调
- ruby-on-rails - Rails - 如何在 db:migrate 之后自定义进程
- java - 带分号java的while循环
- angular - 获得可观察的
从带有选项的 HttpClient.get - javascript - 在同一页面上引导多个 Angular2 应用程序
- powershell - 如何从 CSV 将组成员身份导入新用户
- spring-boot - Spring Boot:无法解析名称为“dispatcherServlet”的servlet中名称为“index”的视图
- python - 在 .xlsx 文件中,如何插入一列,并将其从单元格 A2 填充到最大行?