在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
可以被突变。
您更喜欢哪个?
这取决于您希望其他模块访问集合时发生的情况。在许多情况下,我们希望其他模块能够添加到规范列表中。在某些情况下,我们不这样做。答案是根据您的情况,目的以及设计和使用的意图,采取适当的措施。
在您的情况下,您说:
重要的字符串永远不会在我的程序运行时被修改。
如果从未修改过它们,那么元组就可以了。如果您希望您的代码对可能需要在同一过程中共享数据的其他人有用,那么应该列出一个清单。您提到:
我认为元组不仅是不可变的列表:它们还用于异类集合,当您传递诸如对,三元组等之类的东西时,应该使用它们-固定大小的东西对它们的大小很重要是。Tuples本质上是不可变的列表,并且列表中也可以包含各种对象。是的,大小固定,但这实际上只是不变性的直接结果。
您应该将元组用作不可变列表吗?我不会我将使用列表来说明我的代码的用户负责,并且可以处理他们未编写的模块中的列表。
请注意,如上所述,可以使用元组扩展列表的功能意味着您通常可以从元组开始,然后根据需要移动到列表。
__all__
是模块在以下情况下将导出的公共对象的list