我从不在函数中访问全局变量,而是将它们作为参数传递。因此,下面的代码对我来说很奇怪,我直接从函数中访问全局对象:
ws = WebSocket(url)
sch.on_receive(lambda msg: ws.send(msg))
我该怎么做?
答案 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)