You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:04