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

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

转换为dict构造函数:

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

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

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


当前回答

当你从其他东西(非python)复制粘贴值时,dict()文字很好用 例如,环境变量列表。 如果您有一个bash文件

FOO='bar'
CABBAGE='good'

您可以轻松地将其粘贴到dict()文本中并添加注释。它也使它更容易做相反的事情,复制到其他东西。而{'FOO': 'bar'}语法对于python和json来说是非常独特的。所以如果你经常使用json,你可能会想要使用带有双引号的{}字面量。

其他回答

来自python 2.7教程:

一对大括号创建一个空对象 字典:{}。放置一个 以逗号分隔的键:值列表 对括号内添加初始值 键:值对到字典; 这也是字典的方式 写在输出上。

tel = {'jack': 4098, 'sape': 4139}
data = {k:v for k,v in zip(xrange(10), xrange(10,20))}

而:

dict()构造函数构建 字典直接从列表 键值对存储为元组。当 这些对形成了一个模式,列表 推导式可以紧凑地指定 键值列表。

tel = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'jack': 4098, 'guido': 4127}
data = dict((k,v) for k,v in zip(xrange(10), xrange(10,20)))

当键是简单的字符串时,它 有时更容易指定对吗 使用关键字参数:

dict(sape=4139, guido=4127, jack=4098)
>>>  {'sape': 4139, 'jack':4098, 'guido': 4127}

因此,{}和dict()都生成字典,但提供的字典数据初始化方式略有不同。

当你从其他东西(非python)复制粘贴值时,dict()文字很好用 例如,环境变量列表。 如果您有一个bash文件

FOO='bar'
CABBAGE='good'

您可以轻松地将其粘贴到dict()文本中并添加注释。它也使它更容易做相反的事情,复制到其他东西。而{'FOO': 'bar'}语法对于python和json来说是非常独特的。所以如果你经常使用json,你可能会想要使用带有双引号的{}字面量。

这是一个非常晚的聚会,但如果你有一个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中它们是字符串。

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

class NestedDict(dict):

    # ... skipped

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

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

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