Python 中的可变与不可变对象(简明解释)

发布: (2026年1月13日 GMT+8 16:01)
3 min read
原文: Dev.to

Source: Dev.to

Introduction

本文解释了一个在 Python 中经常引起混淆的核心概念,尤其是在处理数据结构、递归和回溯时。 在 Python 中,对象可以根据其内部状态是否可以改变大致分为两类:

  • 可变对象
  • 不可变对象

理解这一区别对于编写正确且可预测的 Python 代码至关重要。

Mutable Objects

可变对象是指创建后其内容可以被更改的对象。 当你修改可变对象时:

  • 内存中的同一对象被更新。
  • 内存地址 改变。

常见的可变类型包括 listsetdict

a = [1, 2, 3]
a.append(4)
print(a)  # [1, 2, 3, 4]

在上面的例子中,a 仍然指向同一个列表,但列表的内容已在原地被修改。

Immutable Objects

不可变对象是指创建后其内容 不能 被更改的对象。 看似修改它们的任何操作实际上:

  • 会创建一个新对象。
  • 分配一个新的内存地址。

常见的不可变类型包括 intfloatstrtuplefrozenset

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

  • 可变对象(例如 listsetdict)在创建后可以被更改,并保持相同的内存地址。
  • 不可变对象(例如 intfloatstrtuplefrozenset)不能被更改;操作会产生具有新地址的新对象。

牢记可变与不可变的区别有助于避免许多常见错误,并节省大量调试时间。

Back to Blog

相关文章

阅读更多 »