在Python中创build一个空列表

在Python中创build一个新的空列表的最好方法是什么?

l = [] 

要么

 l = list() 

我这样问是因为两个原因:

  1. 技术上的原因,至于哪个更快。 (创build一个类导致开销?)
  2. 代码可读性 – 哪一个是标准约定。

下面是你如何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()本质上比[]慢,因为

  1. 有符号查找(没有办法python预先知道,如果你不只是重新定义列表是别的!),

  2. 有函数调用,

  3. 那么它必须检查是否有可传递的迭代参数(所以它可以创build具有元素的列表)ps。 没有在我们的情况,但有“如果”检查

在大多数情况下,速度差异不会有任何实际的区别。

我用[]

  1. 这是更快的,因为列表符号是一个短路。
  2. 项目创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()