在Python中创build一个空列表
在Python中创build一个新的空列表的最好方法是什么?
l = []
要么
l = list()
我这样问是因为两个原因:
- 技术上的原因,至于哪个更快。 (创build一个类导致开销?)
- 代码可读性 – 哪一个是标准约定。
下面是你如何testing哪一段代码更快:
% python -mtimeit "l=[]" 10000000 loops, best of 3: 0.0711 usec per loop % python -mtimeit "l=list()" 1000000 loops, best of 3: 0.297 usec per loop
但实际上,这种初始化很可能只是程序中非常小的一部分,所以担心这可能是错误的。
可读性是非常主观的。 我更喜欢[]
,但是一些非常有知识的人,比如Alex Martelli,更喜欢list()
因为它是可读的 。
list()
本质上比[]
慢,因为
-
有符号查找(没有办法python预先知道,如果你不只是重新定义列表是别的!),
-
有函数调用,
-
那么它必须检查是否有可传递的迭代参数(所以它可以创build具有元素的列表)ps。 没有在我们的情况,但有“如果”检查
在大多数情况下,速度差异不会有任何实际的区别。
我用[]
。
- 这是更快的,因为列表符号是一个短路。
- 用项目创build一个列表应该看起来与创build一个没有列表相同,为什么应该有区别呢?
我真的不知道,但在我看来,根据经验,jpcgt其实是对的。 下面的例子:如果我使用下面的代码
t = []; t = t.append(1);
在解释器中,然后调用t只给我一个没有任何列表的“t”,如果我追加了其他的东西,例如
t = t.append(2);
我得到错误“'NoneType'对象没有属性'append'”。 但是,如果我通过创build列表
t = list();
那么它工作正常。
我会写[] …虽然我不能提供有关速度的任何细节(我怀疑它会有所作为,除了函数不必知道是否已经交给了一个生成器或另一个可迭代对象)
我会小心上下文…
l=[]
不是创build一个列表! []
是提前创build的列表,上面的指令只是创build一个引用。 它不是一个常量,它是一个可变的对象。 例如,如果你这样做
def f(l=[]): ...
你会发现你每次调用f
时都不会创build列表,而是创build了一个“静态”variablesl
。 正确的做法是
def(l=list()): ...
创build列表的正确方法是list()
。