Python元组的可变与不可变:内存机制深度解析
本文深入解析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 属于引用类型(是可变的)。
总结
以上为个人经验总结,希望能给大家提供一个清晰的参考。也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













