1. 核心传递机制
- 按对象引用传递
- 传递对象的引用(非拷贝)
- 可变对象(列表/字典)在函数内修改会影响原对象
- 不可变对象(数字/字符串)修改会创建新对象
1 2 3 4 5
| def modify(obj): obj.append(1) if isinstance(obj, list) else print("不可变对象")
lst = [0] modify(lst)
|
2. 参数匹配规则
两种传递方式
方式 |
匹配规则 |
示例 |
位置参数 |
严格按定义顺序匹配 |
func(1, 2) → a=1, b=2 |
关键字参数 |
按参数名匹配(顺序无关) |
func(b=2, a=1) → a=1, b=2 |
关键特性
- 变量名是否相同不影响参数传递
- 混合使用时:位置参数必须在前
1 2
| func(1, b=2) func(a=1, 2)
|
3. 参数类型总结
四种参数类型
- 位置参数
- 默认参数
1
| def func(a=1, b=2): pass
|
- 可变位置参数 (
*args
)
- 可变关键字参数 (
**kwargs
)
4. 易混淆场景解析
场景 1:顺序影响
1 2 3 4 5
| def demo(a, b): print(f"a={a}, b={b}")
x, y = 10, 20 demo(y, x)
|
场景 2:关键字参数无视顺序
场景 3:默认参数陷阱
1 2 3 4 5 6 7
| def buggy(lst=[]): lst.append(1) return lst
buggy() buggy()
|
5. 最佳实践
- 超过 3 个参数时建议使用关键字参数
- 避免可变对象作为默认参数
- 参数命名要有明确含义
- 复杂函数建议添加类型注解
1 2 3 4 5 6 7
| def good_example( user_id: int, username: str, *, is_admin: bool = False, **options ) -> dict: ...
|
关键记忆点:Python 参数传递只关心调用方式(位置/关键字),与变量名无关。明确传递方式比依赖顺序更可靠。