一个不可变但不可清洗的容器类有什么意义?

时间:2014-09-19 18:10:44

标签: python pandas

Pandas定义了一个FrozenList对象,在其文档中描述为

  

[c] ontainer不允许设置项目,因为它在技术上不可清除,将用于查找,适当等等。

我不明白拥有一个不可变但不可清洗的容器有什么好处。有人能给我一个例子,标准Python元组的可用性会导致问题?

this similar question 的答案没有任何理由为什么人们想要一个不可变但不可用的容器。特别是,它没有解释为什么Python元组的 hashability 使它不适合FrozenList被用于的任何任务。因此,

这个问题不是重复的。

1 个答案:

答案 0 :(得分:1)

这个类确实有点令人困惑,因为关于这个问题的讨论表明它可以通过pandas内部变化,但我不知道这种能力是如何被实际使用的。不可取消没有特别的好处。好处是该对象是可变的(尽管,同样,该问题表明,它只能通过C内部,而不是通过Python代码可变)。如果一个对象是可变的,则它不能是可以清除的。 (或者更确切地说,它的哈希值不能取决于它的可变状态;对于像list / tuple这样的对象,除了它的可变内容之外没有真正的状态,如果它是可变的,那么没有明智的方法可以使它成为可散列的。)

此外,源代码中还有以下评论:

# Sidenote: This has to be of type list, otherwise it messes up PyTables
#           typechecks

正如另一个问题所说,还有其他原因使用自定义类而不是元组。例如,FrozenList具有自定义__repr__

基本上,似乎没有写出类,因为有人认为“我需要一个不可变但不可容纳的容器”。相反,它似乎是因为有人认为“我需要一个可变的类,但只是秘密的,我需要能够为它提供自定义方法,我需要它成为list的子类避免破坏其他图书馆。“关于其他问题/答案的一些评论表明,不可行性本身可能永远不是必要的标准,即使是,由于熊猫如何工作的其他变化,它可能不再是必要的。我没有写过课程,所以我不能确定,但​​在我看来,你在问题中引用的评论误导了真正的动力是什么让这样的课程。