Python元组的可变与不可变:内存机制深度解析

半杯拿铁
半杯拿铁
发布时间:2026-10-16| 5人浏览过
原创

本文深入解析Python中元组(tuple)的“不可变”特性。通过代码示例与内存地址分析,揭示元组内包含可变对象(如列表)时的行为差异。重点阐述元组不可变指其指向的内存地址不变,而非内部元素绝对不可改,并对比列表的可变性机制,帮助开发者正确理解Python的数据类型与内存管理。

Python元组的可变与不可变特性解析

熟悉Python的开发者都知道,元组(tuple)是一种基础数据类型。元组与列表(list)最显著的区别通常被描述为:元组一旦定义,其内容便无法更改。然而,这种“不可变”是否意味着绝对不变?通过观察以下代码示例,你可能会对这一概念产生新的疑问。

相关代码如下:

tuple = (1, 2, 3, [1, 4, 7])
print(tuple)
tuple[3][2] = 100
print(tuple)

在Python编译器中运行上述代码,得到的输出结果如下:

从输出结果来看,元组中的数据似乎发生了改变。这是否意味着元组并非不可变?接下来,我们将通过内存视角来深入解释元组“可变”与“不可变”的本质。

上述内存示意图展示了关键原理:元组和列表均属于引用数据类型,它们在内存中存储的是指向具体元素的地址值。所谓“元组不可变”,指的是元组变量所指向的内存地址内容不可变。在上图中,数值1、2、3以及地址0x200这四个值是固定不变的;而对于地址0x200所指向的列表对象而言,其内部内容是可以被修改的。

为什么元组(Tuple)是不可变的,而列表(List)是可变的?

1. 所谓元组的不可变,指的是元组所指向的内存地址内的内容不可变。

# 关于元组是不可变的
tupleA = (1, 2, 3, 4)
# tupleA[0] = 0  # 报错 TypeError: 'tuple' object does not support item assignment 不支持修改元素
# 查看内存地址 id()
print(id(tupleA))
tupleA = (1, 2, 3, 4)
print(id(tupleA))
tupleA = (0, 1, 2, 3)
print(id(tupleA))

代码输出结果如下:

1960670738208 1960670738208 1960670737888

从上述实例可以看出,当对元组变量tupleA重新赋值时,它绑定到了一个新的对象上,而不是修改了原来的对象。

2. 列表(List)是可变的。

#关于List是可变的
listA = [1, 2, 3]
print(id(listA))
listA[0] = 0
print(listA)
print(id(listA))
listA = [1, 2, 3]
print(id(listA))
listA = [1, 2, 4]
print(id(listA))

代码输出结果如下:

2974141229248 [0, 2, 3] 2974141229248 2974141227968 2974141229248

从上述实例可以看出,对列表变量listA进行重新赋值或修改元素时,它并未绑定到新的对象,而是直接修改了原来的对象。

  • 字典(Dictionary)中的键(key)必须是不可变类型。
  • int、str、tuple 属于值类型(是不可变的)。
  • List、set、dict 属于引用类型(是可变的)。

总结

以上为个人经验总结,希望能给大家提供一个清晰的参考。也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。