为何函数内对字典输入变量的重新赋值在函数外无效果?
为什么Python函数内对字典参数的重新赋值不会影响外部变量?
Python里的函数参数传递是传对象引用,这得区分两个关键操作:修改对象本身的内容和重新给变量赋值新的对象引用,这两者完全不同。
结合你的代码具体分析:
先看你的测试代码:
import json def modify_dict1(a: dict) -> None: new_dict = {1: "one"} a = new_dict # 这里是重新赋值局部变量a的引用 def modify_dict2(a: dict) -> None: a[1] = "1" # 这里是修改a指向的原字典对象的内容 a_global = {1: "ONE"} print(json.dumps(a_global, indent=2)) modify_dict1(a_global) print(json.dumps(a_global, indent=2)) modify_dict2(a_global) print(json.dumps(a_global, indent=2))
关于modify_dict1的行为:
当你调用modify_dict1(a_global)时,函数参数a一开始拿到的是指向a_global这个字典对象的引用。但执行a = new_dict时,你只是把函数内部的局部变量a的引用换成了新创建的new_dict对象,和原来的a_global没有任何关系了——外部的a_global仍然指向最初的字典,所以打印结果不会变。
关于modify_dict2的行为:
a[1] = "1"是直接对a指向的原字典对象进行修改,因为a和a_global指向同一个可变字典对象,所以这个修改会同步反映到外部的a_global上,打印结果会变化。
如果想让modify_dict1的修改影响外部,有两种常见方法:
- 返回新字典,外部重新赋值:
def modify_dict1(a: dict) -> dict: new_dict = {1: "one"} return new_dict # 调用时重新赋值给a_global a_global = modify_dict1(a_global)
- 修改原字典的内容而非重新赋值:
def modify_dict1(a: dict) -> None: new_dict = {1: "one"} a.clear() # 清空原字典内容 a.update(new_dict) # 将新字典的内容合并到原字典中
这样修改后,就能得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

