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

为何函数内对字典输入变量的重新赋值在函数外无效果?

为什么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的修改影响外部,有两种常见方法:

  1. 返回新字典,外部重新赋值:
def modify_dict1(a: dict) -> dict: 
  new_dict = {1: "one"}
  return new_dict

# 调用时重新赋值给a_global
a_global = modify_dict1(a_global)
  1. 修改原字典的内容而非重新赋值:
def modify_dict1(a: dict) -> None: 
  new_dict = {1: "one"}
  a.clear()  # 清空原字典内容
  a.update(new_dict)  # 将新字典的内容合并到原字典中

这样修改后,就能得到你预期的输出结果。

内容的提问来源于stack exchange,提问作者roschach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:14:55