Python参数传递机制深度解析:从变量赋值到函数传参

听雨眠
听雨眠
发布时间:2026-10-12 | 1人浏览过
原创

本文深入解析Python参数传递机制,指出其本质为“赋值传递”或“对象引用传递”。通过对比整型等不可变对象与列表等可变对象在函数调用中的行为差异,阐明变量指向关系对结果的影响。文章结合代码示例,详细讲解赋值、删除及垃圾回收机制,帮助开发者准确理解Python中变量与对象的内存关系,避免常见误区。

在深入探讨Python参数传递的具体过程之前,有必要先厘清Python中变量与赋值的基本运作原理。掌握这一基础概念,将有助于更透彻地理解参数在函数间传递时的实际行为。

Python变量及赋值机制

基础数据类型

代码示例分析

In [1]: a = 1
In [2]: b = a
In [3]: a = a + 1

首先执行赋值操作 a = 1,此时变量 a 指向整数对象 1。在Python中,万物皆对象。随后执行 b = a,这意味着变量 b 也指向了同一个整数对象 1。Python允许一个对象被多个变量引用。需要注意的是,对于 int、str 等不可变数据类型,执行 a = a + 1 这类操作时,Python并不会直接修改原对象的值,而是创建一个新的整数对象 2,并让变量 a 指向这个新对象。原有的整数对象 1 仍保留在内存中,且继续被变量 b 指向。此时,a 和 b 的值分别为 2 和 1。

In [4]: a
Out[4]: 2

In [5]: b
Out[5]: 1

通过上述示例可见,a 和 b 初始时仅指向同一个对象,可视为该对象的两个不同名称。简单的赋值操作 b = a 并未创建新对象,仅是增加了引用。指向同一对象并不意味着两个变量被“绑定”在一起;对其中一个变量重新赋值(如修改指向),不会影响另一个变量的指向或值。

可变数据类型:列表

再看一个涉及列表的例子:

In [6]: l1 = [3,4,5,6]
In [7]: l2 = l1
In [10]: l1.append(7)
In [11]: l1
Out[11]: [3, 4, 5, 6, 7]
In [12]: l2
Out[12]: [3, 4, 5, 6, 7]

代码中,变量 l1 和 l2 均指向列表对象 [3, 4, 5, 6]。由于列表是可变数据结构,执行 append 操作不会创建新对象,而是在原列表末尾添加元素,使其变为 [3, 4, 5, 6, 7]。因为 l1 和 l2 同时指向该列表,所以列表的修改会同步反映在两个变量上,最终 l1 和 l2 的值均变为 [3, 4, 5, 6, 7]。

对象与变量的删除机制

在Python中,变量可以被删除,但对象本身无法直接通过变量名删除。

In [22]: a = [1,4,5]

In [23]: del a

del 语句删除的是变量 a 的引用,使得无法再通过 a 访问列表 [1, 4, 5]。然而,该列表对象在内存中依然存在。只有当Python的垃圾回收机制检测到该对象的引用计数降为 0 时,才会将其回收。

核心要点总结

  • 变量赋值仅表示让变量指向某个对象,而非拷贝对象;一个对象可被多个变量指向。
  • 可变对象(如列表、字典、集合)的修改会影响所有指向该对象的变量。
  • 不可变对象(如字符串、整型、元组)的值不可直接修改。通过 += 等操作更新不可变对象时,会生成并返回一个新对象。
  • 变量可被删除,但对象需等待引用计数为 0 时由垃圾回收机制处理。

Python函数参数传递机制

Python的参数传递机制可称为“赋值传递”或“对象引用传递”。由于Python中一切皆对象,函数传参时,仅是让形参变量与实参变量指向同一个对象。以下通过示例说明:

In [28]: def func(b):
  ...:   b = 2

In [29]: a = 1

In [30]: func(a)

In [31]: a
Out[31]: 1

在此例中,参数传递使变量 a 和 b 同时指向整数对象 1。当执行 b = 2 时,系统创建新的整数对象 2 并让 b 指向它;而 a 仍指向原对象 1。因此,a 的值保持为 1 不变。

若需改变 a 的值,该如何操作?

可以在函数中将新值通过 return 语句返回。

def func(b):
  b = 2
  return b
a = 1
a = func(a)
a
2

上述示例针对整型,接下来观察列表类型的传参情况:

def func(l2):
  l2.append(77)

l1 = [12,3,6]
func(l1)
l1
[12,3,6,77]

此处 l1 和 l2 初始指向值为 [1, 2, 3] 的列表。由于列表可变,执行 append() 函数在末尾添加元素 4 时,原列表被修改,因此 l1 和 l2 的值均随之更新。

观察以下示例,结果会如何?

def func(l2):
  l2 = l2 + [4]

l1 = [12,3,6]
func(l1)
l1
[12,3,6]

结果显示 l1 未发生变化。原因是 l2 = l2 + [4] 操作创建了一个包含新元素 4 的新列表对象,并让 l2 指向该新对象;而 l1 仍指向原有的列表对象。

结论回顾

本文探讨了Python变量及其赋值的基本原理,并解析了参数传递机制。与其他语言不同,Python的参数传递既非单纯的“值传递”,也非传统的“引用传递”,而是“赋值传递”(或称对象引用传递)。关键在于,这种传递指向的是具体的对象实例,而非固定的内存地址。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表