我正在努力学习Python,并密切关注通用编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我正努力把注意力集中在学习的最佳实践上,这样我以后就不必忘记任何“坏”习惯了。
我看到了两种常用的dict初始化方法:
a = {
'a': 'value',
'another': 'value',
}
b = dict(
a='value',
another='value',
)
哪种被认为是“更python化的”?你用哪一种?为什么?
我正在努力学习Python,并密切关注通用编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我正努力把注意力集中在学习的最佳实践上,这样我以后就不必忘记任何“坏”习惯了。
我看到了两种常用的dict初始化方法:
a = {
'a': 'value',
'another': 'value',
}
b = dict(
a='value',
another='value',
)
哪种被认为是“更python化的”?你用哪一种?为什么?
当前回答
我几乎总是使用大括号;然而,在某些情况下,当我在编写测试时,我做关键字打包/解包,在这些情况下,dict()更易于维护,因为我不需要更改:
a=1,
b=2,
to:
'a': 1,
'b': 2,
在某些情况下,当我想稍后将其转换为命名元组或类实例时,它也会有所帮助。
在实现本身,由于我对优化的痴迷,并且当我没有看到特别大的可维护性好处时,我总是倾向于使用大括号。
在测试和实现中,我永远不会使用dict(),如果当时或将来添加的键有可能会:
不总是字符串 不仅包含数字,ASCII字母和下划线 以整数开始(dict(1foo=2)引发SyntaxError)
其他回答
有时候dict()是一个不错的选择:
a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))
供您参考,如果您需要向字典添加属性(附加到字典的东西,但不是键之一),那么您将需要第二种形式。在这种情况下,你可以用任意字符的键初始化你的字典,一次一个,如下所示:
class mydict(dict): pass
a = mydict()
a["b=c"] = 'value'
a.test = False
我认为第一个选项更好,因为您将以a['a']或a['another']的方式访问值。字典中的键是字符串,没有理由假装它们不是。对我来说,关键字语法乍一看很聪明,但再一看就模糊了。只有当你使用__dict__时,这对我来说才有意义,并且关键字稍后将成为属性,类似这样的东西。
花括号。将关键字参数传递给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
第一个版本更可取:
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.