python函数参数是对象引用传递:变量是对象的标签,不可变对象赋值不改变外部,可变对象就地修改会影响外部;避免修改需用copy()或deepcopy()。

Python函数参数既不是纯粹的“值传递”,也不是传统的“引用传递”,而是对象引用传递——传递的是对象的引用(即内存地址),但这个引用本身是按值传递的。
变量本质:名字绑定到对象
Python中变量不是容器,而是指向对象的标签。赋值操作(如 a = [1, 2, 3])只是把名字 a 绑定到一个列表对象上。多个变量可以绑定到同一个对象(如 b = a),此时它们共享该对象。
不可变对象:表现像“值传递”
对 int、str、tuple 等不可变对象,函数内重新赋值不会影响外部:
- def func(x): x = 100 —— 这只是让局部变量 x 指向新整数对象,原变量不变
- 外部的 a 仍指向原来的整数,看起来像“传值”
可变对象:修改内容会影响外部
对 list、dict、set 等可变对象,若在函数内调用就地修改方法,外部会同步变化:
立即学习“Python免费学习笔记(深入)”;
- def func(lst): lst.append(4) → 调用后原列表多出一个元素
- 因为 lst 和外部变量指向同一列表对象,append() 改变了该对象的内容
- 但如果写成 lst = [1, 2, 3],则只是重绑局部变量,不影响外部
如何避免意外修改?
若不希望函数修改原始可变对象,显式创建副本:
- 列表:func(my_list.copy()) 或 func(my_list[:])
- 字典:func(my_dict.copy()) 或 func(dict(my_dict))
- 嵌套结构需用 copy.deepcopy()









