Pat*_*ins 8 python coding-style tuples list immutability
在Python中使用元组而不是模块级常量迭代列表是不错的样式?例如,我在我的文件顶部有一个重要字符串列表,我需要在输入中查找:
IMPORTANT_STRINGS = [
"Hello world!",
"Goodbye world!",
"Foo...",
# etc --- there are about 40 entries
]
Run Code Online (Sandbox Code Playgroud)
IMPORTANT_STRINGS 我的程序运行时永远不会被修改.
一方面,我认为不变性是好的,我应该尽可能地选择不可变数据结构,所以我应该使用元组代替.
另一方面,我认为元组不仅仅是不可变的列表:它们用于异性集合,当你传递诸如pair,triples等的东西时应该使用它们 - 大小很重要的固定大小的东西他们是什么.我也不认为我曾经在野外看过使用元组这样的常量的Python代码,我觉得看起来很奇怪:
IMPORTANT_STRINGS = (
"Hello world!",
etc
)
Run Code Online (Sandbox Code Playgroud)
创建一个模块,将其命名为foo.py并插入以下内容:
FOO = 'a', 'b'
BAR = ['a', 'b']
Run Code Online (Sandbox Code Playgroud)
现在导入它们并查看它们如何响应就地操作:
>>> 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']
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,FOO元组仍然保持其原始状态,作为foo模块中的规范集合.BAR另一方面,可以变异.
你更喜欢哪个?
这取决于其他模块访问集合时您想要发生的事情.在许多情况下,我们希望其他模块能够添加到规范列表中.在某些情况下,我们没有.答案是根据您的环境,目的和设计和使用意图做适当的事情.
在你的情况下,你说:
在我的程序运行时,永远不会修改重要的字符串.
如果他们永远不应该被修改,那么元组就可以了.如果您希望您的代码对可能需要在同一进程中共享数据的其他人有用,那么您应该使用列表.
你提到:
我认为元组不仅仅是不可变的列表:它们用于异类集合,当你传递诸如成对,三元组等东西时应该使用它们 - 固定大小的东西,其大小对它们来说很重要.
我不会太过于陷入异质性.元组本质上是不可变列表,列表也可以包含各种对象.是的,固定大小,但这实际上只是不变性的直接结果.
请注意,如上所示,使用元组扩展列表的能力意味着您通常可以从元组开始,然后根据需要移动到列表.
我会去找元组.元组更快,不可变,并且 - 因此 - 更安全.为什么你想要一个应该是不可变的东西的可变类型?
关于"元组用于异类集合"的论点对我来说毫无意义.列表也可以存储异构元素.假设tuples = heterogeneous和lists = homogeneous只是一个泛化,通常你想要一个列表迭代元素并且类似地使用它们(如果不是以完全相同的方式至少以多态方式)
另一方面,元组在某种意义上与结构略有相似,用于存储在您编码的模型中具有某种关系的值,并且这种方式与异构元素相关,但为什么它们不能相同类型?例如,一个三维向量将表示为一个元组(至少是最直观的方式),但它只由3个数字组成,我们应该使用一个列表,因为它们是相同的吗?