【发布时间】:2020-02-28 00:23:01
【问题描述】:
以下两个python语句有什么区别?
l = [1,2,3,4]
a = {item:0 for item in l}
b = dict((item,0) for item in l)
a == b
# True
我相信第一种方法是通过 PEP 的理解来初始化字典的正确方法,但第二种方法似乎只是创建一个生成器表达式,然后从中创建一个 dict(所以它可能做完全相同的事情作为幕后的第一种方法?)。两者之间究竟有什么区别,应该优先选择哪一个?
【问题讨论】:
-
您已经准确描述了区别,第一个直接使用 dict-comprehension 构建字典(本质上是循环的糖:
result = {}; for item in l: result[item] = 0。另一个创建生成器表达式并将其传递给 @ 987654324@构造函数...最直接的方法是使用前一种方法。 -
唯一的区别将是真正的技术差异,例如如果您将名称
dict重新分配为其他名称,第一个将起作用。另外,第一个可能效率更高。 -
语义上,如果我们假设没有内置名称被遮蔽,那么两者是相同的,并且具有相同的时间/空间复杂度,尽管生成器表达式可能会稍微慢一些,因为它添加不必要的迭代生成器表达式而不是直接迭代列表的层。
标签: python generator python-internals