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

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

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

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

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


当前回答

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

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

其他回答

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

# 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