asyncio任务中全局变量处理结果不符合预期问题咨询
问题原因
该现象和asyncio运行逻辑无关,本质是Python变量作用域规则导致的:
- 你在
test()协程内部定义的x属于函数局部作用域变量,不属于全局作用域变量 - 嵌套函数
myfunc()中使用global x声明后,Python只会从全局作用域查找、修改名为x的变量,完全不会访问test()协程的局部作用域 - 代码运行时
myfunc()执行后实际是在全局作用域新建了一个值为expected的x变量,test()中打印的始终是自身局部作用域里值为strange的x,因此会持续输出This is strange
验证方式
你可以新增打印全局变量的逻辑验证该结论:
import asyncio async def test(): x = "strange" while True: def myfunc(): global x x = "expected" myfunc() print("This is " + x) # 新增打印全局作用域x的逻辑 print("全局作用域x值:" + globals()["x"]) await asyncio.sleep(1) loop = asyncio.get_event_loop() loop.create_task(test()) loop.run_forever()
运行后可以看到全局作用域的x确实为expected,仅test()的局部x未被修改。
修复方案
如果要修改外层嵌套函数的局部变量,需要使用nonlocal关键字替代global:
将myfunc()中的global x修改为nonlocal x,运行后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者user105939
相关产品推荐
相关产品推荐

