使用PyCharm,我注意到它提供转换字典文字:

d = {
    'one': '1',
    'two': '2',
}

转换为dict构造函数:

d = dict(one='1', two='2')

这些不同的方法是否在某些重要的方面有所不同?

(在写这个问题时,我注意到使用dict()似乎不可能指定一个数字键..D = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one'…)是不可能的。还有别的事吗?)


当前回答

Literal更快,因为它使用优化的BUILD_MAP和STORE_MAP操作码,而不是通用的CALL_FUNCTION:

> python2.7 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.958 usec per loop

> python2.7 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.479 usec per loop

> python3.2 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.975 usec per loop

> python3.2 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.409 usec per loop

其他回答

还要考虑这样一个事实:与运算符匹配的令牌不能在构造函数语法中使用,即dasherized key。

>>> dict(foo-bar=1)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression

>>> {'foo-bar': 1}
{'foo-bar': 1}

Literal更快,因为它使用优化的BUILD_MAP和STORE_MAP操作码,而不是通用的CALL_FUNCTION:

> python2.7 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.958 usec per loop

> python2.7 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.479 usec per loop

> python3.2 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.975 usec per loop

> python3.2 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.409 usec per loop

我发现dict字面量d = {'one': '1'}更可读,你定义的数据,而不是分配东西值并将它们发送给dict()构造函数。

另一方面,我看到有人将字典文本错误地输入为d = {'one', '1'},这在现代python 2.7+中将创建一个集合。

尽管如此,我仍然更喜欢使用集合文字,因为我认为它更可读,我认为个人偏好。

python 3.4 + pycharm的一个重大区别是dict()构造函数 如果键数超过256,则产生“语法错误”消息。

我现在更喜欢使用字典字面。

我想你已经指出了最明显的区别。除此之外,

第一个不需要查找字典,这应该使它稍微快一点

第二个在locals()中查找dict,然后在globals()中查找内置的,所以你可以通过定义一个称为dict的局部来切换行为,例如,尽管我想不出除了调试时可能在任何地方这将是一个好主意