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

为何全局列表可在函数内修改而无需使用global关键字?

Python中global关键字的使用逻辑:看操作,不看类型

核心结论:global的使用和变量类型无关,只和你对变量的操作方式有关——是修改对象本身的内部状态,还是给变量重新赋值一个新对象。

1. 不可变对象(int/str/tuple等)必须用global才能修改全局变量

不可变对象的特点是:一旦创建就无法修改自身内容,所谓的“修改”其实是生成一个新对象,然后把变量指向这个新对象。这时候如果在函数内直接操作,Python会默认你是在创建局部变量,而非修改全局变量,必须用global声明告知Python你要操作的是全局变量。

示例(以int和tuple为例):

# 整数(不可变)
num = 10
def change_num():
    global num  # 必须声明global
    num = 20

change_num()
print(num)  # 输出20

# 元组(不可变)
my_tuple = (1,2)
def change_tuple():
    global my_tuple  # 必须声明global
    my_tuple = (3,4)  # 生成新元组并重新赋值

change_tuple()
print(my_tuple)  # 输出(3,4)

2. 可变对象(list/dict/set等):修改内部状态无需global,重新赋值需要

可变对象允许直接修改自身的内部元素(比如列表append、字典修改键值),这时候你没有改变变量指向的对象,只是操作对象的内部状态,所以不需要global声明。但如果要给变量重新赋值一个新的可变对象,依然需要global。

示例(以list和dict为例):

# 列表(可变):修改内部元素
my_list = [1,2,3]
def update_list():
    my_list.append(4)  # 直接修改列表内部,无需global

update_list()
print(my_list)  # 输出[1,2,3,4]

# 列表:重新赋值新对象
def reassign_list():
    global my_list  # 必须声明global
    my_list = [5,6,7]

reassign_list()
print(my_list)  # 输出[5,6,7]

# 字典(可变):修改键值对
my_dict = {"name": "Alice"}
def update_dict():
    my_dict["age"] = 25  # 修改内部,无需global

update_dict()
print(my_dict)  # 输出{"name": "Alice", "age": 25}

总结

  • 只要是给变量重新赋值(不管变量指向的是可变还是不可变对象),都需要用global声明,告诉Python你要操作的是全局变量,而非创建局部变量。
  • 只是修改可变对象的内部状态(不改变变量指向的对象),不需要global。

内容的提问来源于stack exchange,提问作者高造擎

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:42:52