python - Python 中模块级常量的元组与列表?

标签 python list coding-style tuples immutability

在 Python 中使用元组而不是列表作为模块级常量迭代器是一种好的风格吗?例如,我的文件顶部有一个重要字符串列表,我需要在输入中查找这些字符串:

IMPORTANT_STRINGS = [
  "Hello world!",
  "Goodbye world!",
  "Foo...",
  # etc --- there are about 40 entries
]

IMPORTANT_STRINGS 在我的程序运行时永远不会被修改。

一方面,我认为不可变性很好,我应该尽可能选择不可变数据结构,所以我应该改用元组。

另一方面,我认为元组不仅仅是不可变的列表:它们适用于异构集合,当你传递诸如对、三元组等东西时应该使用它们——固定大小的东西,它们的大小对于它们是什么很重要。我也不认为我曾经在野外看到过使用元组作为常量的 Python 代码,在我看来它看起来真的很奇怪:

IMPORTANT_STRINGS = (
   "Hello world!",
   etc
 )

最佳答案

创建一个模块,将其命名为 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 另一方面,可以改变。

你更喜欢哪个?

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

在你的情况下,你说:

IMPORTANT STRINGS will never be modified while my program is running.

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

你提到:

I think that tuples are more than just immutable lists: they're for heterogenous collections that should be used when you're passing around things like pairs, triples, etc --- fixed-size things whose size is important to what they are.

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

你应该使用元组作为不可变列表吗?我不会。我会根据我的代码的用户负责的理论使用列表,并且可以处理来自他们未编写的模块的修改列表。

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

关于python - Python 中模块级常量的元组与列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33700927/

相关文章:

python-3.x - 从列表列表中查找最高元素的索引

python - 分割和剥离输出 python

python - 忽略 python 变量

python - 使用字典列表转换列,其中列名和值都作为值存在于字典键中

Python ArangoDB

c# - 使用扩展方法来增强可读性

coding-style - pythonic方式在没有索引变量的情况下做N次?

python - 使静态方法显式引用该类

python - 有没有一种方法可以对数据帧中的索引级别求和,同时保留重复的索引级别?

python - 隐藏在 django-filter 中产生零结果的过滤器项