2024-05-16 05:37:09 发布
网友
我从不从函数内部访问全局变量,而是将它们作为参数传入。因此,我觉得下面的代码很奇怪,我直接从函数内部访问全局对象:
ws = WebSocket(url) sch.on_receive(lambda msg: ws.send(msg))
我该怎么做?在
你写的有什么问题吗?它不一定访问全局范围,而是真正访问局部范围(如果找不到变量,则使用全局范围)。作为一个例子,这是非常好的:
def func(): ws = WebSocket(url) sch.on_receive(lambda msg: ws.send(msg))
正因为如此,我认为它更像是一个闭包,而不是访问全局变量。如果您没有使用lambda来完成此操作,请参考以下方法:
lambda
或者更简洁:
wrapper = lambda url: Websocket(url).send sch.on_receive(wrapper(url))
但这实际上相当于:
sch.on_recieve(WebSocket(url).send)
不使用global,从函数(包括lambda)访问全局变量没有问题:
global
>>> a = 1 >>> b = list() >>> >>> def f(): ... b.append(a) ... >>> f() >>> print(b) [1]
正如您在上面看到的,可以读取全局变量,并且可以不受任何限制地使用变量中的对象。在
没有global就无法完成的是将一个对象分配给一个全局变量。这是因为赋值会自动创建一个局部变量。在
因此,以下是可以的:
另一方面,如果你真的想给一个全局变量赋值,那在lambda中是不可能的(除了通过黑客手段,比如访问globals目录…)
你写的有什么问题吗?它不一定访问全局范围,而是真正访问局部范围(如果找不到变量,则使用全局范围)。作为一个例子,这是非常好的:
正因为如此,我认为它更像是一个闭包,而不是访问全局变量。如果您没有使用
^{pr2}$lambda
来完成此操作,请参考以下方法:或者更简洁:
但这实际上相当于:
不使用
global
,从函数(包括lambda)访问全局变量没有问题:正如您在上面看到的,可以读取全局变量,并且可以不受任何限制地使用变量中的对象。在
没有
^{pr2}$global
就无法完成的是将一个对象分配给一个全局变量。这是因为赋值会自动创建一个局部变量。在因此,以下是可以的:
另一方面,如果你真的想给一个全局变量赋值,那在lambda中是不可能的(除了通过黑客手段,比如访问globals目录…)
相关问题 更多 >
编程相关推荐