在 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/