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