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
相关产品推荐
相关产品推荐

