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

Python中字典传参后值被修改,整数却不变的原因?

为什么字典作为参数传递会被修改,而整数不会?

我发现将字典作为参数传递给函数时,其表现类似全局变量,这在Python中是合理的,但不同类型变量的行为差异令我意外。

示例代码

main.py

import mymodule

an_int = 42
a_dict = {'value':42}

mymodule.print_and_reassign(a_dict, an_int)
mymodule.print_again(a_dict, an_int)

mymodule.py

def print_and_reassign(a_dict, an_int):

    # Dictionary
    print(f"Dictionary value: {a_dict['value']}")
    a_dict['value']=970

    # Integer
    print(f"Integer value: {an_int}")
    an_int=970


def print_again(a_dict, an_int):

    # Dictionary
    print(f"Dictionary value: {a_dict['value']}")

    # Integer
    print(f"Integer value: {an_int}")

运行结果

Dictionary value: 42
Integer value: 42
Dictionary value: 970
Integer value: 42

原因解析

这本质是Python中可变类型和不可变类型的差异,结合Python的参数传递规则导致的:

  • Python的参数传递是「传对象引用」:当你把变量传给函数时,函数内的参数拿到的是原对象的引用,不是对象的副本。
  • 字典是可变类型:这类对象的内部数据可以被直接修改。你在函数里执行a_dict['value']=970时,是直接在原字典对象上修改它的键值对,所以外部的a_dict会同步看到这个变化。
  • 整数是不可变类型:这类对象一旦创建就无法修改。你在函数里执行an_int=970时,并不是修改原来的42这个整数对象,而是创建了一个新的整数970,然后让函数内的局部变量an_int指向这个新对象。外部的an_int仍然指向原来的42,所以值不会发生变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:33:25