从lambda中访问全局

时间:2016-10-08 18:58:53

标签: python

我从不在函数中访问全局变量,而是将它们作为参数传递。因此,下面的代码对我来说很奇怪,我直接从函数中访问全局对象:

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

我该怎么做?

2 个答案:

答案 0 :(得分:1)

在不使用global的情况下,从函数(包括lambdas)访问全局变量没有问题:

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

如上所示,可以读取全局变量,并且可以不受任何限制地使用变量中的对象。

如果没有global,则无法将分配对象分配给全局变量。这是因为赋值会自动创建局部变量。

def f():
    a = 4  # this is a new local variable a, regardless of whether there is a global 'a'

因此,以下情况很好:

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

另一方面,如果你真的想为全局变量赋值,那在lambda中是不可能的(除了通过黑客攻击,比如访问全局变量目录......)

答案 1 :(得分:0)

你写的是什么问题?它不一定访问全局范围,它实际上访问本地范围(如果它没有找到该变量使用全局范围)。举个例子,这很好:

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

因此我认为它更像是一个闭包而不是访问全局变量。如果您没有使用lambda执行此操作,请执行以下操作:

def wrapper(url):
    ws = WebSocket(url)
    def send(msg):
        return ws.send(msg)
    return send

sch.on_receive(wrapper(url))

或更简洁:

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

但这实际上只相当于:

sch.on_recieve(WebSocket(url).send)