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

Python两个函数运行结果不同 是否与值类型和引用类型有关?

Python函数参数修改行为差异原因

这个问题的核心是Python的对象传递规则以及可变/不可变对象的特性差异,具体拆解如下:

1. Python的参数传递本质

Python所有函数参数传递的都是对象的引用,既不是传统意义的传值(复制整个对象),也不是C++那种传变量地址。简单说就是调用函数时,形参会和实参指向同一个内存里的对象,后续行为完全取决于你对这个引用做了什么操作、以及对象本身是否可变。

2. 两个案例的差异拆解

案例1:修改字符串(不可变对象)

字符串、数字、元组都属于不可变对象,一旦创建就不能修改内部内容。
调用changeName(name)时,形参n和外部变量name都指向同一个字符串对象"matt"。
函数内执行n = "david"属于给形参重新绑定新对象:相当于让n放弃原来的"matt"引用,转而指向新创建的字符串对象"david",这个操作完全不会影响外部name的指向,也不会修改原"matt"对象,所以最终打印name还是输出"matt"。

案例2:修改列表元素(可变对象)

列表、字典、集合属于可变对象,创建后可以自由修改内部的元素,对象本身的内存地址不会变化。
调用change(cities)时,形参a和外部变量cities都指向同一个列表对象。
函数内执行a[0] = "istanbul"属于修改原有对象的内部内容:并没有让a指向新的对象,只是修改了它指向的这个列表的第一个元素,外部的cities还是指向同一个列表,所以自然能看到修改后的结果。

补充说明

如果想要在函数内修改不可变对象的外部取值,有两种常用方案:

  • 把修改后的结果用return返回,外部变量重新接收返回值
  • 把不可变对象放到列表、字典这类可变容器里,再修改容器内的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:51:02