Python 传递需要列表或元组的参数时要传递什么?

Python 传递需要列表或元组的参数时要传递什么?,python,list,data-structures,coding-style,tuples,Python,List,Data Structures,Coding Style,Tuples,我应该使用以下哪项?为什么 import numpy as np a = np.zeros([2, 3]) b = np.zeros((2, 3)) 在很多情况下,你可以用任何一种方式传递参数,我只是想知道一种方式是否更像Pythonic,或者是否有其他理由认为一种方式比另一种方式更可取 我研究了人们试图解释元组和列表之间区别的地方。这不是我感兴趣的,除非有我应该关心的理由,当然我忽略了 更新: 尽管使用了numpy作为示例,但这通常适用于python。非numpy示例如下所示: a = ma

我应该使用以下哪项?为什么

import numpy as np
a = np.zeros([2, 3])
b = np.zeros((2, 3))
在很多情况下,你可以用任何一种方式传递参数,我只是想知道一种方式是否更像Pythonic,或者是否有其他理由认为一种方式比另一种方式更可取

我研究了人们试图解释元组和列表之间区别的地方。这不是我感兴趣的,除非有我应该关心的理由,当然我忽略了

更新:

尽管使用了numpy作为示例,但这通常适用于python。非numpy示例如下所示:

a = max([1, 2, 3, 5, 4])
b = max((1, 2, 3, 5, 4))

我不是在编辑上面的内容,因为有些答案在解释中使用了numpy

我是在将文本iterable传递给构造函数或函数的上下文中回答这个问题的,超过这个上下文,类型就无关紧要了。如果需要传入可哈希参数,则需要一个元组。如果需要对其进行变异,请传入一个列表(这样就不会将元组添加到元组中,从而成倍地创建对象)

你问题的答案是,更好的选择因情况而异。这是折衷办法

从可更改的
list
type开始,它为将来的扩展预先分配内存:

a = np.zeros([2, 3])
Pro:易于阅读

Con:它浪费内存,而且性能较差

接下来是
元组
类型,它是不可变的。它不需要为将来的扩展预先分配内存,因为它无法扩展

b = np.zeros((2, 3))
Pro:它使用最少的内存,而且性能更高

Con:可读性稍差

我的偏好是在需要考虑内存的情况下传递元组文本,例如,许多人将使用的长时间运行的脚本。另一方面,当我使用交互式解释器时,我更喜欢传递列表,因为它们更具可读性,方括号和括号之间的对比便于可视化解析

您应该只关心函数的性能,其中代码被编译为字节码:

>>> min(timeit.repeat('foo()', 'def foo(): return (0, 1)'))
0.080030765042010898
>>> min(timeit.repeat('foo()', 'def foo(): return [0, 1]'))
0.17389221549683498

最后,请注意,性能考虑因素与其他考虑因素相比会相形见绌。使用Python是为了提高开发速度,而不是算法实现的速度。如果你使用了一个糟糕的算法,你的性能会差得多。它在许多方面也非常出色。我认为这仅仅是一个重要的问题,如果它能改善大量使用的过程,从一千个死亡的死亡中消失。

< P>如果在设计时(如坐标、颜色系统)已知项目的数量,那么我将使用元组,否则与列表一起。
如果我正在编写一个接口,我的代码将倾向于只检查参数是iterable还是sequence(而不是检查特定类型,除非接口需要特定类型)。我使用collections模块进行检查——它比检查特定属性更干净

我认为这对Stackoverflow来说是一个很好的问题。谢谢你的提问,还有一个问题。除非这个问题是针对
numpy
(看起来不是),否则最好使用一个通用示例。除了预分配可能扩展的列表的一般不重要的轻微开销之外,这似乎是一个很好的关于自行车脱落的话题。我看到有人投票结束了这个话题,因为这是基于观点的,然而,我已经帮助提问者重申了客观的问题。我相信这是一个很好的问题,我不认为它应该被关闭。对不起,伙计们,如果这个问题是基于意见的。我尽力编辑,谢谢@AaronHall的编辑。你说得对,它不是特定于numpy的,它可能更多地取决于列表原语或元组原语是否已经是某些给定上下文中的主要使用模式。我想如果你正在设计NumPy本身,在大量的用例中工作,那么就使用tuple。但是,如果您正在为某家公司的团队将要使用的API构建一个小扩展,并且他们已经有一个相当大的代码库,倾向于在很多地方假设列表,那么使用列表可能更好,这样人们就不必从列表中构造元组来使用您的API。我认为这一点使列表的轻微内存开销相形见绌。@MarkRansom谢谢,但如果这是一个考虑因素,它可能是最后的考虑因素。@AaronHall实际上在这个问题的上下文中,我的评论不合适,所以我收回它。问题是,如果调用的函数带有序列参数,那么应该使用列表还是元组?如果被调用函数要将参数放入字典或集合中,它将坚持获取元组,而您将没有选择余地。@MarkRansom正是这样。说得好。