如何在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 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。