为何全局列表可在函数内修改而无需使用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,提问作者高造擎
相关产品推荐
相关产品推荐

