据我所知,它们本质上都是一样的,但就风格而言,用于创建空列表或字典的更好(更多Pythonic)?
答案 0 :(得分:172)
就速度而言,没有竞争空名单/决定:
>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077
和非空:
>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267
另外,使用括号表示法让你使用列表和字典理解,这可能是合理的。
答案 1 :(得分:30)
在我看来,[]
和{}
是创建空列表/词典的最pythonic和可读方式。
但要警惕set()
,例如:
this_set = {5}
some_other_set = {}
可能令人困惑。第一个创建一个包含一个元素的集合,第二个创建一个空字典,不一个集合。
答案 2 :(得分:26)
list()本身比[]慢,而dict()本身比{}慢,
<强>由于强>
有符号查找(如果你不只是将列表重新定义为其他东西,python就无法事先知道!),
有函数调用,
然后必须检查是否传递了可迭代的参数(因此它可以创建包含元素的列表)
在大多数情况下,速度差异不会产生任何实际差异。
(source)
答案 3 :(得分:14)
dict文字可能比 tiny 更快,因为它的字节码更短:
In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()
In [4]: dis.dis(a)
1 0 BUILD_MAP 0
3 RETURN_VALUE
In [5]: dis.dis(b)
1 0 LOAD_GLOBAL 0 (dict)
3 CALL_FUNCTION 0
6 RETURN_VALUE
同样适用于list
vs []
答案 4 :(得分:3)
恕我直言,使用list()
和dict()
使你的Python看起来像C.呃。
答案 5 :(得分:2)
list()和[]的工作方式不同:
>>> def a(p):
... print(id(p))
...
>>> for r in range(3):
... a([])
...
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
... a(list())
...
139969725367296
139969725367552
139969725367616
list()总是在堆中创建新对象,但是[]可以出于多种原因重用存储单元。
答案 6 :(得分:1)
如果[]和list()之间存在差异,那么我还没有看到其他任何人指出的陷阱。 如果您使用字典作为列表的成员,则两者将给出完全不同的结果:
In [1]: foo_dict = {"1":"foo", "2":"bar"}
In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]
In [3]: list(foo_dict)
Out [3]: ['1', '2']
答案 7 :(得分:0)
[]和list()之间的行为有一个区别,如下例所示。如果我们想要返回数字列表,我们需要使用list(),否则我们得到一个地图对象!不知道如何解释它。
sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth)
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list
type(sth2[0]) # map
sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
答案 8 :(得分:0)
list() 和 [] 之间没有这样的区别,但是如果你将它与迭代器一起使用,它会给我们:
nums = [1,2,3,4,5,6,7,8]
输入:print([iter(nums)])
输出:[
输入:print(list(iter(nums)))
出:[1, 2, 3, 4, 5, 6, 7, 8]
答案 9 :(得分:-1)
方括号对表示列表对象之一或索引下标my_List [x]。
花括号对表示字典对象。
a_list = ['on','off',1,2]
a_dict = {开启:1,关闭:2}
答案 10 :(得分:-2)
timeit似乎没有给出准确的时间。根据上面针对dict()提到的timeit基准测试,它似乎需要~200ms,这比普通的http调用要慢。尝试在shell,dict()然后timeit(“dict()”)中运行,你会看到执行中的明显差异; timeit(“dict()”)需要更长时间。按照一段代码复制粘贴并在shell中运行,你不会在{}&amp;字典()。
from datetime import datetime
then = datetime.now()
a = dict()
now = datetime.now()
print then
print now
then = datetime.now()
b = {}
now = datetime.now()
print then
print now
答案 11 :(得分:-5)
这主要是大部分时间的选择问题。这是一个偏好的问题。
但请注意,如果您有数字键,那么您无法做到:
mydict = dict(1="foo", 2="bar")
你必须这样做:
mydict = {"1":"foo", "2":"bar"}