javascript - 散景回调范围
问题描述
据我所知,在 Python 中,函数外部声明的变量可以被后者访问,但不能被修改(除非我们在函数中将它们声明为全局,请参阅https://www.datacamp.com/community /tutorials/scope-of-variables-python)。
我正在学习使用 Bokeh,我想通过回调修改实例(下拉列表、表格......)。根据上一段,如果后者未声明为全局,则回调无法修改这些实例。但是下面的代码示例有效...
userList = ['a', 'b', 'c', 'd']
folderList = ['e', 'f', 'g', 'h']
s = MultiSelect(options=userList, size=4, width=1000)
ti = TextInput(placeholder='Enter reference')
def populateDropdown(attr, old, new):
#nonlocal s, ti
if new == 0:
options = userList
else:
options =folderList
s.options = options
ti.callback = CustomJS(args=dict(options=s.options, s=s),code="s.options =
options.filter(i =>i[0].toLowerCase().includes(cb_obj.value.toLowerCase()));console.log(options);")
usersFoldersChoice = RadioButtonGroup(labels=["Users", "Folders"])
usersFoldersChoice.on_change('active', populateDropdown)
多选预先填充了userlist
. 有两个单选按钮,如果单击“文件夹”,则会触发回调“populateDropdown”。此回调必须重新填充多选s
,folderList
并更新链接到文本输入的回调ti
。在这里,s
并且ti
在没有将它们声明为全局的情况下进行了修改,并且它可以工作,这让我感到困惑。
另外,如果我不明白为什么我必须更新链接到的回调ti
以考虑更改s
(起初,回调ti
在其声明期间直接分配给,但它不起作用......)
提前感谢您的澄清!
解决方案
你的直觉不太对劲。您不能分配给函数外部的变量。也就是说,这个函数不会更新x
函数外的值:
x = {}
def f():
x = [] # this makes a new local variable
但是,如果函数之外的对象是可变的,即它们可以“就地”修改,那么通过调用它们的方法来更新它们是没有问题的。例如:”
x = {}
def f():
x['a'] = 10 # this will update the x dict in place
这就是为什么 Bokeh 回调可以操作在函数之外定义的小部件或数据源对象。
我不太明白你的最后一个问题。
推荐阅读
- sql-server - 为 AD 用户运行带有 -E 选项的 SQLCMD 时失败
- kubernetes - Kubernetes hpa cpu 利用率
- vba - 如何使用 XMLHTTP60 对象从 VBA 中的重定向 URI 获取授权码值?
- android - for 语句在 while 语句结束之前返回
- cloud - ICP4D(IBM Cloud Pak for Data)也可以用作数据质量工具吗?
- javascript - 是否可以从 javascript 中的“构造函数”调用类方法?
- xml - 如何在属性之后读取 XML 值
- javascript - 量角器测试中的条件:如果元素包含特定文本则执行操作
- swift - alamofire 中的时间间隔来观察 API 的变化
- excel - 如果另一列数据相等,则对列中的值求和