Python参数传递本质是对象引用传递:不可变对象(如数字、字符串)在函数内修改会绑定新对象,原变量不变;可变对象(如列表、字典)调用就地方法会改变原对象;可通过浅拷贝、深拷贝或返回新对象避免意外修改。

Python 中传递参数值主要靠“对象引用传递”,但实际效果常被理解为“按对象传值”——关键看对象是否可变。
不可变对象:看起来像“传值”
数字、字符串、元组等不可变对象,函数内修改会创建新对象,原变量不受影响:
-
例子:
def add_one(x): x += 1; print(x);调用num = 5; add_one(num)输出 6,但num仍是 5 - 本质是
x += 1重新绑定了局部变量x到新整数对象,没改原对象
可变对象:修改会影响原对象
列表、字典、集合等可变对象,函数内直接调用方法(如 .append()、.update())会改变原对象:
-
例子:
def append_item(lst): lst.append('new');调用my_list = [1]; append_item(my_list)后my_list变成[1, 'new']
- 因为
lst 和my_list指向同一个列表对象,操作的是它本身
想避免意外修改?主动复制
若不希望函数改动原始可变对象,传入前手动拷贝:
立即学习“Python免费学习笔记(深入)”;
- 浅拷贝:
func(my_list.copy())或func(my_list[:])(仅适用于列表) - 深拷贝(嵌套结构):
import copy; func(copy.deepcopy(my_dict)) - 函数内部也可先复制:
local_lst = lst.copy(),再操作local_lst
显式控制:用返回值代替就地修改
更清晰、更安全的做法是让函数返回新对象,由调用方决定是否赋值:
-
推荐写法:
def add_item(lst, item): return lst + [item];然后new_list = add_item(old_list, 'x') - 这样逻辑明确,原列表不变,也方便链式调用或测试
基本上就这些。记住核心:Python 传的是对象的引用,但“能不能改原对象”,取决于对象类型和你用了什么操作。











