是什么让 python 元组不可变。它们是如何在内存中实现的?

Zen*_*rra 0 python tuples

我想知道 python 元组是如何成为不可变的,从某种意义上说,它们是如何在内存中实现的,以至于我们无法更改它们的值?

python 列表in general是作为动态数组实现的,可以通过直接访问索引并分配不同的值来修改特定索引处的值。元组是不可变的,但是什么条件使它们不可变呢?为什么我们不能改变它们的值,就像内存元素被一个列表上的额外条件锁定,使其成为一个元组?

一个字符串是不可变的,它是不可变的,因为它的状态不能改变是有道理的。一个字符串p将始终代表p. 但是元组怎么了?

上面的任何定义都非常笼统,我不确定当我说python list is implemented as a dynamic array.

请建议实施的工作原理以及我可以阅读更多相关信息的任何来源。

编辑:我已经看到这个线程:元组是如何在 CPython 中实现的?但我无法正确理解它。我需要一个更简单的解释。

use*_*ica 7

元组的实现或内存布局没有什么特别之处使它们不可变。他们是不可变的,因为他们根本不具有任何突变操作。

列表是可变的,因为list该类实现了类似append__setitem__改变列表的操作。此类操作必须有意包含在实施中;它们不会自动出现。如果list没有 mutator 操作,列表也将是不可变的。

在 C 实现级别,实现元组的 C 代码必须能够写入元组的内存,并且在该级别,数据结构是可变的。但是,实现呈现给 Python 代码的接口是不可变的。

你不能对你在 Python 中实现的类做同样的事情,因为你无法在实现和接口之间获得明确的分离。由于 Python C API 的设计,在 C 中实现 Python 类时会自动出现这种分离,但是如果没有像private访问修饰符这样的东西,你就不能在 Python 中做同样的事情。