当前位置: 首页 > 知识库问答 >
问题:

无法修改python中异步函数(协程)中的全局变量

龚勇锐
2023-03-14

我在jupyter notebook(python 3.6.8)中运行此代码。我希望代码打印2作为结果,但不知何故它仍然打印1。我想知道为什么。

import asyncio
x = 1

async def func():
    global x
    x = 2
    print(x)

await func()
print(x)

我使用的jupyter笔记本环境是:

  • jupyter核心:4.6.3
  • jupyter-笔记本:6.1.4
  • QtConsole:4.7.7
  • ipython:7.16.1
  • ipycore:5.3.4
  • jupyter客户端:6.1.7
  • jupyter实验室:2.2.9
  • nb转换:6.0.7
  • ipywidgets:7.5.1
  • nb格式:5.1.2
  • traitlet:4.3.3

共有1个答案

应翰飞
2023-03-14

如果要在IPython协同例程中更改全局变量,必须获取异步IO。锁定。

import asyncio

x = 1

async def func():
    global x
    lock = asyncio.Lock()
    await lock.acquire()
    x = 2
    lock.release()

await func()
print(x)  # 2
 类似资料:
  • 问题内容: 为什么不能使用exec()从函数内部更改全局变量?当赋值语句在exec()之外时,它可以正常工作。这是我的问题的一个例子: 问题答案: 根据文档,该语句采用两个可选表达式,默认为和,并且始终在其中进行更改(如果有)。 因此,请更加明确/具体/精确…: …并且您将能够使全局变量更贴近您的内心。

  • 问题内容: 我知道我应该避免由于这样的混乱而首先使用全局变量,但是如果我要使用它们,以下是使用它们的有效方法吗?(我正在尝试调用在单独函数中创建的变量的全局副本。) 第二个函数使用的是否具有与使用和修改的的全局副本相同的值?定义后调用函数时,顺序重要吗? 问题答案: 如果你只想访问全局变量,则只需使用其名称即可。但是,要更改其值,你需要使用global关键字。 例如 这会将全局变量的值更改为55。

  • 我知道由于这样的混淆,我应该首先避免使用全局变量,但是如果我要使用它们,以下是使用它们的有效方法吗?(我正在尝试调用在单独的函数中创建的变量的全局副本。) 第二个函数使用的是否与使用和修改的的全局副本具有相同的值?定义后调用函数时,顺序重要吗?

  • 问题内容: 如何在函数中创建或使用全局变量? 如果在一个函数中创建全局变量,如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要对其进行访问的函数的局部变量中? 问题答案: 你可以在其他函数中使用全局变量,方法是像在分配给它的每个函数中一样声明它: 我想这是因为全局变量是如此危险,因此Python希望通过显式要求使用关键字来确保您真正知道这就是要使用的内容。

  • 问题内容: 该文件说: Swift编译器会自动将C和Objective-C源文件中定义的全局常量作为Swift全局常量导入。 但这并没有说相反的话。我需要定义一个全局swift常数,并且能够像全局c常数一样客观地看到它。如快速定义: 并在物镜c端使用它,例如 我该怎么办?我已经导入了迅速自动生成的标题,例如: 在Xcode中,如果我使用它,它将带我到swift代码中的正确位置,但是在编译时,我得到