假设我有需要迭代的组件,例如“From”和“To”。为方便起见,我可以遍历这些字符串,但我不需要将它们存储任何延长的时间段,因为我只需要执行一次。在这种情况下使用列表或元组会更好吗?
info = {}
for type in ('from', 'to'):
info[type] = fetch(type);
请注意,如果将元组更改为列表,则上述操作将完全相同;我想知道是否有一些偏好。
答案 0 :(得分:7)
如果您不打算对其进行更改,我认为元组更适用。当我需要对集合进行动态操作时,我只使用列表,如append,subtract等。
另外,在大多数情况下,访问元组的速度更快。话虽如此,您应该在决定之前测试您的具体用例。
答案 1 :(得分:7)
元组很可能性能更高,因为它们是不可变的。反汇编还表明,较少的操作码与元组一起使用:
2 0 SETUP_LOOP 14 (to 17)
3 LOAD_CONST 3 (('a', 'b'))
6 GET_ITER
VS
2 0 SETUP_LOOP 20 (to 23)
3 LOAD_CONST 1 ('a')
6 LOAD_CONST 2 ('b')
9 BUILD_LIST 2
12 GET_ITER
但这并不重要,如果这一点性能很重要,你应该写C或汇编代码。
答案 2 :(得分:1)
元组显然在内存上更小,创建速度更快但有1或2项我无法想象它在99.99%的情况下会如何重要。
答案 3 :(得分:1)
在这种情况下,元组可能比列表更好,但你也可以
for item in a, b:
process(item)
我想知道在这种情况下究竟发生了什么:P
编辑:它转换为:
3 LOAD_CONST 3 (('a', 'b'))
这似乎是一个元组......
答案 4 :(得分:1)
如果我理解你的问题,你会问在这种情况下使用什么惯用。 (性能和内存效率在这里几乎没有重要性,因为你说你只做了一次。)
答案是,对于Python的大部分存在,人们倾向于使用元组来抛弃常数,主要是因为习惯在无意改变时使用不可变的东西。
[编辑:摆脱一些关于集合的无关紧要的东西。当它实际上没有贡献时,我太急于把它变成答案。]
请注意,有时候声音少数人坚持列表。其基本原理是列表最初被设想为Python的“数组”类型,而元组是“记录”类型。也就是说,列表用于保存单个类型的多个对象(如测试分数集合),而元组用于保存任意相关对象(如名称,地址和电话号码)。但是,现在严格遵守这一点是古老而古怪的。