从lambd中访问全局

2024-05-16 05:37:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我从不从函数内部访问全局变量,而是将它们作为参数传入。因此,我觉得下面的代码很奇怪,我直接从函数内部访问全局对象:

ws = WebSocket(url)
sch.on_receive(lambda msg: ws.send(msg))

我该怎么做?在


Tags: 对象lambda函数代码sendurl参数ws
2条回答

你写的有什么问题吗?它不一定访问全局范围,而是真正访问局部范围(如果找不到变量,则使用全局范围)。作为一个例子,这是非常好的:

def func():
    ws = WebSocket(url)
    sch.on_receive(lambda msg: ws.send(msg))

正因为如此,我认为它更像是一个闭包,而不是访问全局变量。如果您没有使用lambda来完成此操作,请参考以下方法:

^{pr2}$

或者更简洁:

wrapper = lambda url: Websocket(url).send
sch.on_receive(wrapper(url))

但这实际上相当于:

sch.on_recieve(WebSocket(url).send)

不使用global,从函数(包括lambda)访问全局变量没有问题:

>>> a = 1
>>> b = list()
>>>
>>> def f():
...     b.append(a)
...
>>> f()
>>> print(b)
[1]

正如您在上面看到的,可以读取全局变量,并且可以不受任何限制地使用变量中的对象。在

没有global就无法完成的是将一个对象分配给一个全局变量。这是因为赋值会自动创建一个局部变量。在

^{pr2}$

因此,以下是可以的:

ws = WebSocket(url)
sch.on_receive(lambda msg: ws.send(msg))

另一方面,如果你真的想给一个全局变量赋值,那在lambda中是不可能的(除了通过黑客手段,比如访问globals目录…)

相关问题 更多 >