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

dao*_*oad 204 python dictionary

我正在努力学习Python,我正在密切关注常见的编码标准.这可能看起来像是一个毫无意义的挑剔问题,但我正在努力专注于我学习的最佳实践,所以我不必忘记任何"坏"习惯.

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

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

b = dict( 
    a='value',
    another='value',
)
Run Code Online (Sandbox Code Playgroud)

哪个被认为是"更加pythonic"?你用哪个?为什么?

Wai*_*ung 228

大括号.传递关键字参数dict()虽然在很多场景中都能很好地工作,但只有在密钥是有效的Python标识符时才能初始化映射.

换句话说,它不能做:

a = {'import': 'trade', 1: 7.8}
Run Code Online (Sandbox Code Playgroud)


Amb*_*ber 82

第一个,花括号.否则,您会遇到包含奇数字符的键的一致性问题,例如=.

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

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

  • 这正是为什么人们可能更喜欢dict()方法进行初始化,它强制字典键是有效的标识符,因此它们与例如**kwargs兼容,并且键是有效的属性名称. (11认同)

ste*_*han 57

第一个版本更可取:

  • 它适用于所有类型的键,例如,您可以说{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
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果不打算使用字典文字的特殊语法,则可能不存在.


小智 6

我几乎总是使用花括号;但是,在我编写测试的某些情况下,我会进行关键字打包/解包,并且在这些情况下 dict() 更易于维护,因为我不需要更改:

a=1,
b=2,
Run Code Online (Sandbox Code Playgroud)

到:

'a': 1,
'b': 2,
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我认为我可能想稍后将其转换为命名元组或类实例,这也有帮助。

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

在测试和实现中,如果当时或将来添加的键有可能会:

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