Python回调变量作用域
我有一个函数Python回调变量作用域,python,matplotlib,scope,Python,Matplotlib,Scope,我有一个函数fun(),它在单击matplotlib图形时绑定回调callback()。我希望此回调能够访问fun()的变量空间进行更改。我该怎么办 import numpy as np import matplotlib.pyplot as plt def callback(event): data = event.xdata def fun(): data = 0 fig, ax = plt.subplots() ax.plot(np.random.ra
fun()
,它在单击matplotlib图形时绑定回调callback()
。我希望此回调能够访问fun()
的变量空间进行更改。我该怎么办
import numpy as np
import matplotlib.pyplot as plt
def callback(event):
data = event.xdata
def fun():
data = 0
fig, ax = plt.subplots()
ax.plot(np.random.rand(12), np.random.rand(12), 'go')
fig.canvas.mpl_connect('button_release_event', callback)
plt.show()
return data
print fun()
将
数据
放入全局
范围是不可接受的解决方案。该功能应该是自包含的。答案允许我将变量传递给回调(),但不允许我编辑它们。我知道您希望有一些状态,可以在运行时更改。一种选择可能是使用一个可调用对象,该对象不是函数(我没有测试过它):
这样我们就有了一个计数器,可以知道事件发生的频率。但它适用于任何类型的数据,也比整数更复杂。使用嵌套函数(在函数体中定义回调)。但是请注意,调用回调时,fun函数可能已经终止。我已经尝试了
fun()
中的嵌套函数:它不起作用。嵌套的callback()
可以访问fun()
的范围,但不能修改它。你自己试试看。此外,通常在解析plt.show()
之前(即在画布交互之后),函数不会终止。在上面的脚本中,我没有提前终止的问题。事实上,你可以使用一些小技巧。看见您可以使用dict,比如d=dict(data=0),然后在嵌套函数中修改d[“data”]。这解决了我的问题。
class Callback(object):
def __init__(self, data):
self.data = data
def __call__(self, event):
# Manipulate the data
self.data += 1
...
datacallback = Callback(0)
fig.canvas.mpl_connect('button_release_event', datacallback)
print datacallback.data