【问题标题】:What makes python tuples immutable. How are they implemented in the memory?是什么让 python 元组不可变。它们是如何在内存中实现的?
【发布时间】:2020-04-14 01:21:33
【问题描述】:

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

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

还有

字符串是不可变的,为什么它是不可变的是有道理的,因为它的状态不能改变。字符串p 将始终表示p。但是元组是怎么回事?

上面的任何定义都非常笼统,当我说python list is implemented as a dynamic array 时,我不确定python 考虑了哪些额外的条件或情况。

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

编辑:我已经看到了这个帖子:How is tuple implemented in CPython? 但我无法正确理解。我需要一个更简单的解释。

【问题讨论】:

  • 这能回答你的问题吗? How is tuple implemented in CPython?
  • @KentShikama 不,我已经编辑了我的帖子。谢谢
  • 谁能解释为什么这个问题会被否决?如果不清楚,我会修改它。
  • “直接相对于 Python 本身” - 你这是什么意思? CPython 是 Python 的参考实现。我可以创建自己的 Python 实现,使用 [insert crazy data structure here] 来实现元组,但我假设你对此不感兴趣。

标签: python tuples


【解决方案1】:

元组的实现或内存布局没有什么特别之处,这使得它们不可变。它们是不可变的,因为它们只是没有任何修改器操作。

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

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

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

【讨论】:

  • 好吧,说得有道理!这就是它在实现中的定义方式,它们上没有定义mutator operations,所以我们不能使用它们,这使得元组不可变。好的!此外,这意味着如果我想在 Python 中创建自己的不可变类,那是不可能的。我必须使用现有的不可变数据结构来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多