Python中包含可变元素的元组如何在内存中存储?
元组包含可变元素时的内存存储机制
首先明确核心点:Python里的元组,不管元素是可变还是不可变,存储的都是对象引用,而非直接存储值。
元组的“不可变”到底指什么?
元组的不可变,是指它自身维护的那组引用的集合不可变——你不能修改元组里的引用指向,比如不能执行t[2] = [4]这种替换操作。但如果某个引用指向的是可变对象(比如列表、字典),你完全可以修改这个可变对象的内部状态,就像你代码里做的那样:
t = (1,2,[]) t[2].append(3) # 修改的是列表对象本身,不是元组里的引用 print(t) # (1, 2, [3])
这时候元组里的第三个引用还是指向原来的列表对象,只是这个列表的内容变了,所以元组本身的内存结构并没有被破坏,依然符合“不可变”的定义。
连续内存块的作用
元组的引用确实会被存储在连续的内存块中,这也是元组效率高的原因之一。但要注意:这些引用指向的实际对象(比如列表),它们的内存位置可以是分散的。比如你的例子里,元组的连续内存块里存了三个引用:
- 指向整数对象
1的引用 - 指向整数对象
2的引用 - 指向空列表对象的引用
当你给列表添加元素时,列表对象自己的内存空间会扩容,但元组里的那个引用始终没变,所以元组的连续内存块内容完全没动。
不存在“存储引用还是值”的选择
Python里所有对象都是通过引用存储的,没有例外。像整数、字符串这类不可变对象,你感觉像是“存值”,只是因为这些对象本身不能被修改,所以引用指向的内容不会变,看起来和直接存值效果一样,但本质上还是存的引用。
内容的提问来源于stack exchange,提问作者Dharmesh Kakadia
相关产品推荐
相关产品推荐

