Python参数传递机制_引用行为说明【指导】

6次阅读

Python 采用“对象引用传递”:函数接收对象引用的副本,不可变对象赋值创建新对象,可变对象就地修改影响外部;需用 copy()保护原始可变对象。

Python 参数传递机制_引用行为说明【指导】

Python 中没有传统意义上的“传值”或“传引用”,而是 统一采用“对象引用传递”:函数接收的是实参对象的引用(即内存地址的副本),但这个引用本身是按值传递的。关键在于理解对象的可变性(mutable vs immutable)如何影响外部变量的表现。

不可变对象(如 int、str、tuple):看似“传值”

对参数重新赋值(如 x = x + 1)会创建新对象,原变量不受影响,因为不可变对象无法就地修改。

  • 函数内修改参数名指向——只改变局部引用,不影响调用方变量
  • 字符串拼接、数字运算等操作均生成新对象,原对象和原变量绑定关系不变

可变对象(如 list、dict、set):可“就地修改”影响外部

若在函数内调用对象的原地方法(如 lst.append()dct.update()),因操作的是同一块内存中的对象,外部变量可见变化。

  • 使用 += 对列表操作等价于 extend(),属于就地修改
  • lst = lst + [1] 是重新赋值,创建新列表,不影响外部

如何安全控制参数行为?

明确意图,避免意外共享:

立即学习Python 免费学习笔记(深入)”;

  • 若需保护原始可变对象,传入副本:func(lst.copy())func(lst[:])
  • 若需返回新对象而非修改原对象,函数内显式构造并 return,不依赖副作用
  • 文档或参数命名中注明是否修改入参(如 inplace=True

一个典型误区示例

以下代码常被误认为“传引用所以能改原值”,实则是可变对象特性所致:

def add_item(items):     items.append("new")  # ✅ 就地修改,调用方列表变化 def replace_items(items):     items = ["a", "b"]   # ❌ 局部重绑定,不影响外部

两次调用后,只有第一次改变了原始列表。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-02发表,共计805字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources