在 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 中创建一个空列表的主要内容,如果未能解决你的问题,请参考以下文章