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

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

转换为dict构造函数:

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

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

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


当前回答

它们在Python 3.2中看起来基本相同。

正如gnibbler指出的那样,第一个不需要查找字典,这应该会让它更快一点。

>>> def literal():
...   d = {'one': 1, 'two': 2}
...
>>> def constructor():
...   d = dict(one='1', two='2')
...
>>> import dis
>>> dis.dis(literal)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('one')
              9 STORE_MAP
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('two')
             16 STORE_MAP
             17 STORE_FAST               0 (d)
             20 LOAD_CONST               0 (None)
             23 RETURN_VALUE
>>> dis.dis(constructor)
  2           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_CONST               1 ('one')
              6 LOAD_CONST               2 ('1')
              9 LOAD_CONST               3 ('two')
             12 LOAD_CONST               4 ('2')
             15 CALL_FUNCTION          512
             18 STORE_FAST               0 (d)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE

其他回答

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

还要考虑这样一个事实:与运算符匹配的令牌不能在构造函数语法中使用,即dasherized key。

>>> dict(foo-bar=1)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression

>>> {'foo-bar': 1}
{'foo-bar': 1}

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

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

我想你已经指出了最明显的区别。除此之外,

第一个不需要查找字典,这应该使它稍微快一点

第二个在locals()中查找dict,然后在globals()中查找内置的,所以你可以通过定义一个称为dict的局部来切换行为,例如,尽管我想不出除了调试时可能在任何地方这将是一个好主意

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

FOO='bar'
CABBAGE='good'

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