在 Python 中创建一个空列表

Posted

技术标签:

【中文标题】在 Python 中创建一个空列表【英文标题】:Creating an empty list in Python 【发布时间】:2011-02-27 16:04:49 【问题描述】:

在 Python 中创建新的空列表的最佳方法是什么?

l = [] 

l = list()

我问这个有两个原因:

    技术原因,至于哪个更快。 (创建类会导致开销?) 代码可读性 - 哪个是标准约定。

【问题讨论】:

“更快”?为什么不运行 timeit? 【参考方案1】:

以下是测试哪段代码更快的方法:

% 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(),因为it is pronounceable。

【讨论】:

哇,感谢您的分析。我一直想知道它是怎么做到的。 为什么list('')[] 而不是[''] 这是因为这个函数从可迭代类型中创建列表,你不能插入超过 1 个参数。 (尝试输入list('abcd'),你就明白了)【参考方案2】:

list() 本质上比[] 慢,因为

    有符号查找(如果您不只是将列表重新定义为其他内容,python 无法提前知道!),

    有函数调用,

    然后它必须检查是否传递了可迭代参数(因此它可以从中创建包含元素的列表)ps。在我们的例子中没有,但有“if”检查

但在大多数情况下,速度差异不会产生任何实际差异。

【讨论】:

+1:很高兴能理解为什么list()[] 慢! list() 的情况下,它只需要检查是否有任何参数......“检查是否可迭代”和“使用元素创建列表”就不会发生;它们仅适用于存在 arg 的情况。 [] 的 C 代码甚至可能调用与 list() 相同的 C 代码。无论如何,与 (a) + (b) 相比,(c) 所涉及的时间会很小。 @John Machin - 很抱歉造成混淆,我在 (c) 中的意思是它需要检查是否存在争论,是的。剩下的就是如果有争论会发生什么,在我们的例子中没有【参考方案3】:

我使用[]

    它更快,因为列表符号是短路的。 使用项创建列表应该与创建没有列表的列表大致相同,为什么会有区别?

【讨论】:

【参考方案4】:

我真的不知道,但在我看来,根据经验,jpcgt 实际上是正确的。以下示例:如果我使用以下代码

t = [] # implicit instantiation
t = t.append(1)

在解释器中,然后调用 t 给我的只是 "t" 没有任何列表,如果我附加其他内容,例如

t = t.append(2)

我收到错误“'NoneType' 对象没有属性 'append'”。但是,如果我通过

创建列表
t = list() # explicit instantiation

然后它就可以正常工作了。

【讨论】:

这是因为t.append(1) 修改了t,它只返回None,并且您将这个None 分配给t。所以t 现在指的是None 而不是列表。你的错误是写t=t.append(1) 而不是t.append(1)。您会注意到 list() 的行为相同,因此这里没有区别。【参考方案5】:

只是为了突出显示@Darkonaut answer,因为我认为它应该更明显。

new_list = []new_list = list() 都可以(忽略性能),但append() 返回None,结果你不能做new_list = new_list.append(something)

【讨论】:

以上是关于在 Python 中创建一个空列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 numpy 中创建一个“接受”附加的空列表网格?

在 Python 中创建一个新字典

如何在 NumPy 中创建一个空数组/矩阵?

如何在 Dart 中创建一个空 Set

如何在 emacs 中创建一个空文件?

如何在python中创建等效结构并使用malloc更改空指针的引用