Python 中的可变与不可变对象(简明解释)
Source: Dev.to
Introduction
本文解释了一个在 Python 中经常引起混淆的核心概念,尤其是在处理数据结构、递归和回溯时。 在 Python 中,对象可以根据其内部状态是否可以改变大致分为两类:
- 可变对象
- 不可变对象
理解这一区别对于编写正确且可预测的 Python 代码至关重要。
Mutable Objects
可变对象是指创建后其内容可以被更改的对象。 当你修改可变对象时:
- 内存中的同一对象被更新。
- 内存地址 不 改变。
常见的可变类型包括 list、set 和 dict。
a = [1, 2, 3]
a.append(4)
print(a) # [1, 2, 3, 4]
在上面的例子中,a 仍然指向同一个列表,但列表的内容已在原地被修改。
Immutable Objects
不可变对象是指创建后其内容 不能 被更改的对象。 看似修改它们的任何操作实际上:
- 会创建一个新对象。
- 分配一个新的内存地址。
常见的不可变类型包括 int、float、str、tuple 和 frozenset。
x = 10
x = x + 1
print(x) # 11
发生了什么
- 整数
10并未被修改。 - 创建了一个新整数
11。 x现在指向这个新对象。
Effects of Mutability
对象的可变性会影响 Python 编程的多个方面:
- 函数参数 – 可变参数可以在函数内部被修改,从而影响调用者的变量。
- 递归和回溯 – 不可变对象使得推理状态变化更容易。
- 共享引用 – 多个变量可以引用同一个可变对象,导致意外的副作用。
Example: Mutable Argument
def add_item(lst):
lst.append(100)
nums = [1, 2, 3]
add_item(nums)
print(nums) # [1, 2, 3, 100]
列表 nums 在函数外部被改变,因为它是可变的。
Summary
- 可变对象(例如
list、set、dict)在创建后可以被更改,并保持相同的内存地址。 - 不可变对象(例如
int、float、str、tuple、frozenset)不能被更改;操作会产生具有新地址的新对象。
牢记可变与不可变的区别有助于避免许多常见错误,并节省大量调试时间。