python参数传递是对象引用传递:实参对象id传给形参,二者初始指向同一对象;不可变对象赋值不改变原对象,可变对象就地修改影响外部,重新赋值则解除绑定,可用copy避免副作用。

Python中的参数传递既不是纯粹的传值,也不是纯粹的传引用,而是对象引用的传递。函数调用时,实参的对象身份(id)被传递给形参,形参和实参指向同一对象。以下是理解该机制的关键路径:
一、不可变对象参数的行为表现
当传递数字、字符串、元组等不可变对象时,函数内部对形参的重新赋值不会影响外部变量,因为赋值操作会令形参指向新对象,而原对象未被修改。
1、定义函数 def modify_num(x): x = x + 10
2、初始化变量 a = 5
立即学习“Python免费学习笔记(深入)”;
3、调用 modify_num(a)
4、检查 a 的值仍为 5,id(a) 与函数内修改前的 id(x) 相同,但函数内 x 赋值后 id 发生改变
二、可变对象参数的行为表现
当传递列表、字典、集合等可变对象时,函数内部若调用就地修改方法(如 append、update),则外部对象状态同步变化,因形参与实参始终引用同一内存地址。
1、定义函数 def append_item(lst): lst.append("new")
2、初始化变量 my_list = [1, 2]
3、调用 append_item(my_list)
4、检查 my_list 变为 [1, 2, "new"],且 id(my_list) 与函数内 lst 的 id 始终一致
三、通过赋值遮蔽可变对象的引用
即使传入可变对象,若在函数内对形参执行重新赋值(如 lst = []),则形参脱离原始对象绑定,后续操作不再影响外部变量。
1、定义函数 def reassign_list(lst): lst = ["replaced"]
2、初始化变量 data = ["original"]
3、调用 reassign_list(data)
4、检查 data 仍为 ["original"],函数内 lst 赋值后 id 改变,与 data 的 id 不再相同
四、显式复制避免副作用
为防止函数意外修改外部可变对象,可在调用前或函数内使用浅拷贝或深拷贝,使形参操作独立于原始对象。
1、导入模块 import copy
2、调用时传入副本:process_list(copy.copy(original_list))
3、或在函数开头创建副本:def safe_process(lst): local_lst = lst.copy()
4、后续所有修改均作用于 local_lst,original_list 的 id 和内容保持不变
五、使用 id() 和 is 运算符验证引用关系
可通过内置函数 id() 获取对象内存地址,用 is 运算符判断两个变量是否引用同一对象,这是验证参数传递本质的直接手段。
1、定义变量 a = [1, 2] 和函数 def check_ref(x): print(x is a, id(x) == id(a))
2、调用 check_ref(a),输出 True True
3、在函数内执行 x.append(3),再次检查 x is a 仍为 True
4、在函数内执行 x = [99],再检查 x is a 变为 False,id(x) 与 id(a) 不同









