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

eva*_*n54 2 python coding-style tuples list data-structures

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

import numpy as np
a = np.zeros([2, 3])
b = np.zeros((2, 3))
Run Code Online (Sandbox Code Playgroud)

在很多情况下你可以以任何一种方式传递参数,我只是想知道一个是否更像Pythonic,或者是否有其他原因应该优先于另一个.

我看了一下这个问题,人们试图解释元组和列表之间的区别.这不是我感兴趣的,除非有理由我应该关心,当然我忽略了!

更新:

虽然使用numpy作为示例,但这通常与python有关.非笨拙的例子如下:

a = max([1, 2, 3, 5, 4])
b = max((1, 2, 3, 5, 4))
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*all 5

我在将文字迭代传递给构造函数或函数的上下文中回答这个问题,而构造函数或函数的类型无关紧要.如果你需要传入一个hashable参数,你需要一个元组.如果你需要它变异,传入一个列表(这样你就不会将元组添加到元组,从而使对象的创建成倍增加.)

你的问题的答案是,更好的选择在情境上有所不同.这是权衡.

list类型开始,它是可变的,它预先分配内存以供将来扩展:

a = np.zeros([2, 3])
Run Code Online (Sandbox Code Playgroud)

:它很容易阅读.

骗局:它浪费了记忆力,而且性能较差.

接下来,tuple类型,这是不可变的.它不需要为将来的扩展预分配内存,因为它无法扩展.

b = np.zeros((2, 3))
Run Code Online (Sandbox Code Playgroud)

Pro:它使用最少的内存,而且性能更高.

Con:它的可读性稍差.

我倾向于传递以内存为考虑因素的元组文字,例如,许多人都会使用的长时间运行的脚本.另一方面,当我使用交互式解释器时,我更喜欢传递列表,因为它们更具可读性,方括号和括号之间的对比使得易于视觉解析.

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

>>> min(timeit.repeat('foo()', 'def foo(): return (0, 1)'))
0.080030765042010898
>>> min(timeit.repeat('foo()', 'def foo(): return [0, 1]'))
0.17389221549683498
Run Code Online (Sandbox Code Playgroud)

最后,请注意,其他考虑因素将使性能考虑相形见绌.您使用Python来提高开发速度,而不是算法实现的速度.如果你使用一个糟糕的算法,你的表现会更糟.它在许多方面也非常高效.我认为这只是重要的,因为它可以扩展,如果它可以改善大量使用的过程死于一千次死亡的死亡.

  • @AaronHall实际上在问题的背景下我的评论不合适,所以我把它拿回来.问题是,如果你正在调用一个带序列参数的函数,你应该使用列表还是元组?如果被调用的函数将参数放在字典或集合中,它将坚持获取元组,你将无法选择. (2认同)