初始化dict的首选语法是什么:大括号文字{}还是dict()函数?

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

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

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


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

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

424268 次浏览

第一个,大括号。否则,您将遇到包含奇数字符的键的一致性问题,如=

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


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

第一个版本更可取:

  • 它适用于所有类型的键,所以你可以,例如,说{1: 'one', 2: 'two'}。第二个变体只适用于(某些)字符串键。根据键的类型使用不同类型的语法会造成不必要的不一致。
  • 更快:

    $ 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,

:

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

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

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

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

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