函数如何处理python中的全局对象?执行顺序是什么?

我在 Python 中相对较新,我在 matplotlib ( https://matplotlib.org/examples/widgets/slider_demo.html ) 中使用以下示例。


我已按预期(至少据我所知)按以下方式修改了上述示例(并且它仍然有效)


import numpy as np

import matplotlib.pyplot as plt

from matplotlib.widgets import Slider, Button, RadioButtons




def update(val):

    amp = samp.val

    freq = sfreq.val

    l.set_ydata(amp*np.sin(2*np.pi*freq*t))

    fig.canvas.draw_idle()


def reset(event):

    sfreq.reset()

    samp.reset()




def colorfunc(label):

    l.set_color(label)

    fig.canvas.draw_idle()



if __name__=='__main__':

    fig, ax = plt.subplots()

    plt.subplots_adjust(left=0.25, bottom=0.25)

    t = np.arange(0.0, 1.0, 0.001)

    a0 = 5

    f0 = 3

    s = a0*np.sin(2*np.pi*f0*t)

    l, = plt.plot(t, s, lw=2, color='red')

    plt.axis([0, 1, -10, 10])


    axcolor = 'lightgoldenrodyellow'

    axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)

    axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)


    sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0)

    samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)


    sfreq.on_changed(update)

    samp.on_changed(update)


    resetax = plt.axes([0.8, 0.025, 0.1, 0.04])

    button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')


    button.on_clicked(reset)


    rax = plt.axes([0.025, 0.5, 0.15, 0.15], facecolor=axcolor)

    radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)


    radio.on_clicked(colorfunc)


    plt.show()

从本质上讲,我所做的只是将功能分开。但是,我无法理解更新函数如何“知道” samp 和 sfreq 对象是什么?


由于它有效,我只看到以下选项,即函数每次都会查询“全局”对象的当前值。但是,这在我看来特别容易出错,因为samp和sfreq可能会在更新执行之间发生变化。


所以,问题可能是我什么时候使用


sfreq.on_changed(update)

并设置事件回调,对全局对象的引用变得固定,或者每次调用函数时都会重新评估它们。还是完全发生了其他事情?


MMTTMM
浏览 180回答 1
1回答

慕田峪9158850

让我们来看看函数update:def update(val):&nbsp; &nbsp; amp = samp.val&nbsp; &nbsp; freq = sfreq.val&nbsp; &nbsp; l.set_ydata(amp*np.sin(2*np.pi*freq*t))&nbsp; &nbsp; fig.canvas.draw_idle()每次调用函数时,Python 都会搜索名称,首先在本地命名空间中,其次在全局命名空间中,第三次在 throws 中NameError。名称val、amp和freq位于函数的本地命名空间中。Python 会在第一步找到它们。本地命名空间仅在功能调用持续时存在。名称samp,sfreq,l,fig位于全局命名空间。Python 在第二步找到它们。所以每次fig都是你用线创建的同一个对象fig, ax = plt.subplots()。如果相同的名称同时位于本地和全局命名空间中,Python 会从本地命名空间中取一个,因为它是第一个查找的地方。您可以使用locals()和globals()函数返回字典访问名称空间的内容{"object_name": <object_itself>, ...}。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python