我正在努力学习Python,并密切关注通用编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我正努力把注意力集中在学习的最佳实践上,这样我以后就不必忘记任何“坏”习惯了。

我看到了两种常用的dict初始化方法:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

哪种被认为是“更python化的”?你用哪一种?为什么?


第一个,大括号。否则,如果键中有奇数字符,就会遇到一致性问题,比如=。

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

第一个版本更可取:

It works for all kinds of keys, so you can, for example, say {1: 'one', 2: 'two'}. The second variant only works for (some) string keys. Using different kinds of syntax depending on the type of the keys would be an unnecessary inconsistency. It is faster: $ python -m timeit "dict(a='value', another='value')" 1000000 loops, best of 3: 0.79 usec per loop $ python -m timeit "{'a': 'value','another': 'value'}" 1000000 loops, best of 3: 0.305 usec per loop If the special syntax for dictionary literals wasn't intended to be used, it probably wouldn't exist.


花括号。将关键字参数传递给dict(),尽管它在很多情况下工作得很好,但只有当键是有效的Python标识符时才能初始化映射。

如此:

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

这行不通:

a = dict(import='trade', 1=7.8)

它将导致以下错误:

    a = dict(import='trade', 1=7.8)
             ^
SyntaxError: invalid syntax

我认为第一个选项更好,因为您将以a['a']或a['another']的方式访问值。字典中的键是字符串,没有理由假装它们不是。对我来说,关键字语法乍一看很聪明,但再一看就模糊了。只有当你使用__dict__时,这对我来说才有意义,并且关键字稍后将成为属性,类似这样的东西。


供您参考,如果您需要向字典添加属性(附加到字典的东西,但不是键之一),那么您将需要第二种形式。在这种情况下,你可以用任意字符的键初始化你的字典,一次一个,如下所示:

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

有时候dict()是一个不错的选择:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

我几乎总是使用大括号;然而,在某些情况下,当我在编写测试时,我做关键字打包/解包,在这些情况下,dict()更易于维护,因为我不需要更改:

a=1,
b=2,

to:

'a': 1,
'b': 2,

在某些情况下,当我想稍后将其转换为命名元组或类实例时,它也会有所帮助。

在实现本身,由于我对优化的痴迷,并且当我没有看到特别大的可维护性好处时,我总是倾向于使用大括号。

在测试和实现中,我永远不会使用dict(),如果当时或将来添加的键有可能会:

不总是字符串 不仅包含数字,ASCII字母和下划线 以整数开始(dict(1foo=2)引发SyntaxError)