使用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

其他回答

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

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

此外,当涉及到阅读代码(这是很多)时,我觉得文字的认知负担更少(因为我们将文字与dict()联系在一起,它看起来像一个函数调用,让大脑怀疑……与dict()相比,至少有一微秒:)),不可否认,部分原因是编辑器中的语法高亮显示,但在日常生活中仍然非常相关(至少对我来说)。

如果我关注dict语句周围的代码,表示为…,一个字面dict使我更容易理解周围的代码:)。

...
...
...
config = {
    'key1':"value1",
    'key2':"value2",
    'key3':"value3",
    'key4':"value4",
}
...
...
...

#****VS *****

...
...
...
config =dict(
    key1 = 'value1',
    key2 = 'value2',
    key3 = 'value3',
    key4 = 'value4',

)
...
...
...

没有字典文字来创建字典继承类,自定义字典类与额外的方法。在这种情况下,应该使用自定义dict类构造函数,例如:

class NestedDict(dict):

    # ... skipped

state_type_map = NestedDict(**{
    'owns': 'Another',
    'uses': 'Another',
})

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

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

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

这是一个非常晚的聚会,但如果你有一个kwargs函数:

def foo(a=None, b=None):
    ...

而你的口头语是这样的

d_1 = { 'a': 1, 'b': 2 }
d_2 = dict(a=1, b=2)

# This works
foo(**d_1)

# And this as well
foo(**d_2)

但是d_2可能更适合重构foo签名中可能改变的参数名。因为在d_1中它们是字符串。