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

