如何在Python中使用全局变量(global关键字)

了解全局变量在 Python 中的工作原理。了解变量作用域、本地命名空间与全局命名空间,以及如何使用 global 关键字修改变量。

在编辑器中尝试此解决方案

概述

了解命名空间和变量作用域对于用 Python 编写无错误的软件至关重要。范围决定了程序的哪些部分可以访问或修改变量。在所有函数之外声明的变量存在于全局范围内,并且可以在模块中的任何位置读取。

但是,当函数尝试修改(重新分配)全局变量时,就会出现问题。默认情况下,当 Python 在函数内部看到赋值时,它假定该变量是该函数的局部变量。如果您尝试修改全局变量而不将其声明为全局变量,Python 将创建一个同名的局部变量,保持全局变量不变(或引发“UnboundLocalError”)。

要明确告诉 Python 您想要修改全局命名空间中的变量而不是创建本地变量,您必须在函数内使用“global”关键字声明它。虽然有时需要使用全局变量,但在大型软件设计中通常认为这是一种不好的做法,因为它使状态难以跟踪和调试。

代码和执行输出

该脚本演示了读取全局变量、变量遮蔽陷阱以及使用 global 关键字修改全局变量。

global_variables.py
在编辑器中尝试
counter = 10 # Global variable

def read_counter():
    # Reading a global variable works out-of-the-box
    print("Reading global counter:", counter)

def shadow_counter():
    # Attempting to assign without 'global' creates a local variable
    counter = 20 # Shadowing
    print("Inside shadow function:", counter)

def modify_counter():
    global counter # Declaring we are writing to global scope
    counter = 50
    print("Inside modify function:", counter)

read_counter()
shadow_counter()
print("Counter after shadow function:", counter) # Remains 10

modify_counter()
print("Counter after modify function:", counter) # Now 50
端子输出
Reading global counter: 10
Inside shadow function: 20
Counter after shadow function: 10
Inside modify function: 50
Counter after modify function: 50

逐步实施

  • 声明需要在任何函数作用域之外全局访问的变量。
  • 读取任何函数内的全局变量,无需添加特殊声明。
  • 如果需要修改全局变量值,请在函数内使用 global 关键字(例如全局计数器)。
  • 限制全局变量的使用,以防止范围混乱和命名空间污染。

常见问题解答

Python 中的变量阴影是什么?

当局部作用域(如函数)内声明的变量与外部全局作用域中的变量同名时,就会发生遮蔽。局部变量掩盖了全局变量,使其在该范围内暂时无法访问。

全局关键字和非本地关键字有什么区别?

global 用于访问最外层模块范围中定义的变量。 nonlocal 在嵌套函数内部使用来访问封闭(外部)函数作用域中定义的变量。

相关主题

推荐的 Python 资源

通过相关的交互式教程、备忘单和代码比较来扩展您的知识。