元组vs Python中模块级常量的列表?

时间:2015-11-13 20:06:24

标签: python list coding-style tuples immutability

使用元组而不是Python中的模块级常量迭代列表是不错的样式?例如,我在文件顶部有一个重要字符串列表,我需要在输入中查找:

IMPORTANT_STRINGS = [
  "Hello world!",
  "Goodbye world!",
  "Foo...",
  # etc --- there are about 40 entries
]
我的程序运行时永远不会修改

IMPORTANT_STRINGS

一方面,我认为不变性是好的,我应该尽可能地选择不可变数据结构,所以我应该使用元组代替。

另一方面,我认为元组不仅仅是不可变的列表:它们用于异类集合,当你传递诸如pair,triples等等的东西时应该使用它们 - 固定大小的东西尺寸对它们来说很重要。我也不认为我曾经在野外看过使用元组这样的常量的Python代码,我觉得这看起来很奇怪:

IMPORTANT_STRINGS = (
   "Hello world!",
   etc
 )

3 个答案:

答案 0 :(得分:6)

创建一个模块,将其命名为foo.py并插入以下内容:

FOO = 'a', 'b'
BAR = ['a', 'b']

现在导入它们并查看它们如何响应就地操作:

>>> import foo
>>> from foo import FOO, BAR
>>> FOO += 'c', 'd'
>>> BAR += 'c', 'd'
>>> FOO
('a', 'b', 'c', 'd')
>>> foo.FOO
('a', 'b')
>>> foo.BAR
['a', 'b', 'c', 'd']

正如我们所看到的,FOO,元组仍然保持其原始状态,作为foo模块中的规范集合。另一方面,BAR可以变异。

您更喜欢哪个?

这取决于其他模块访问集合时您想要发生的事情。在许多情况下,我们希望其他模块能够添加到规范列表中。在某些情况下,我们不会。答案是根据您的环境,目的和设计和使用意图做适当的事情。

在你的情况下,你说:

  

重要事项在我的程序运行时,永远不会修改STRINGS。

如果他们从不进行修改,那么元组就可以了。如果您希望您的代码对可能需要在同一过程中共享数据的其他人有用,那么您应该使用列表。

你提到:

  

我认为元组不仅仅是不可变的列表:它们适用于异性集合,当你传递诸如pair,triples等的东西时应该使用它们---固定大小的东西,其大小对他们来说很重要。

我不会太过于陷入异质性。元组本质上是不可变列表,列表也可以包含各种对象。是的,固定大小,但这实际上只是不变性的直接结果。

请注意,如上所示,使用元组扩展列表的能力意味着您通常可以从元组开始,然后根据需要移动到列表。

答案 1 :(得分:5)

我会选择元组。元组更快,不可变,并且 - 因此 - 更安全。为什么你想要一个应该是不可变的东西的可变类型?

“元组用于异类集合”的论点对我来说毫无意义。列表也可以存储异构元素。假设tuples = heterogeneous和lists = homogeneous只是一个泛化,通常你想要一个列表迭代元素并且类似地使用它们(如果不是以完全相同的方式至少以多态方式)

另一方面,元组与某种意义上的结构略有相似,用于存储在您编码的模型中具有某种关系的值,并且这种方式与异构元素相关,但为什么不能使用它们是同一类型?例如,一个三维向量将表示为一个元组(至少是最直观的方式)但它只由3个数字组成,我们应该使用一个列表,因为它们是相同的吗?

答案 2 :(得分:1)

仅针对反驳论点,__all__是公共对象的列表,模块将在以下情况下导出:from <module> import *

这基本上是模块级常量字符串的集合(与您一样),但在整个标准库中实现为列表。快速测试确认tuple也适用于此,但它无处不在。