11

Python 似乎在接受 dicts 的密钥类型方面存在不一致。或者,换一种说法,它允许某些类型的键以一种定义 dicts 的方式,而不是其他方式:

>>> d = {1:"one",2:2}
>>> d[1]
'one'
>>> e = dict(1="one",2=2)
  File "<stdin>", line 1
  SyntaxError: keyword can't be an expression

符号是否{...}更基本,dict(...)只是语法糖?是因为 Python 根本没有办法parse dict(1="one")吗?

我很好奇...

4

4 回答 4

18

这不是dict问题,而是 Python 语法的产物:关键字参数必须是有效的标识符,并且1不是2

当您想使用任何不是遵循 Python 标识符规则的字符串作为键时,请使用{}语法。在某些特殊情况下,构造函数关键字参数语法只是为了方便。

于 2012-04-30T21:10:44.540 回答
9

dict是函数调用,函数关键字必须是标识符。

于 2012-04-30T21:11:05.433 回答
2

正如其他答案所述,dict是一个函数调用。它具有三种句法形式。

表格:

dict(**kwargs) -> new dictionary initialized with the name=value pairs
   in the keyword argument list.  For example:  dict(one=1, two=2)

键(或name本例中使用的键)必须是有效的 Python标识符,并且 int 无效。

限制不仅是功能dict您可以像这样演示它:

>>> def f(**kw): pass
... 
>>> f(one=1)    # this is OK
>>> f(1=one)    # this is not
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression

但是,您可以使用其他两种语法形式。

有:

dict(iterable) -> new dictionary initialized as if via:
       d = {}
       for k, v in iterable:
           d[k] = v

例子:

>>> dict([(1,'one'),(2,2)])
{1: 'one', 2: 2}

从映射中:

dict(mapping) -> new dictionary initialized from a mapping object's
   (key, value) pairs

例子:

>>> dict({1:'one',2:2})
{1: 'one', 2: 2}

虽然这可能看起来不多(来自 dict 文字的 dict),但请记住Counterdefaultdict是映射,这就是您将其中一个转换为 dict 的方式:

>>> from collections import Counter
>>> Counter('aaaaabbbcdeffff')
Counter({'a': 5, 'f': 4, 'b': 3, 'c': 1, 'e': 1, 'd': 1})
>>> dict(Counter('aaaaabbbcdeffff'))
{'a': 5, 'c': 1, 'b': 3, 'e': 1, 'd': 1, 'f': 4}
于 2016-10-04T16:34:51.507 回答
1

如果您阅读文档,您将了解到dict = {stringA = 1, stringB = 2}当键是简单字符串时该表示法是有效的:

当键是简单字符串时,有时使用关键字参数指定对更容易:

>>>
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

由于整数(或其他数字)不是有效的关键字参数,因此dict = {1 = 2, 3 = 4}如果您在用数字命名时将参数传递给它,那么任何对函数的调用都会失败:

>>> def test(**kwargs):
...     for arg in kwargs:
...         print arg, kwargs[arg]
... 
>>> test(a=2,b=3)
a 2
b 3
>>> test(1=2, 3=4)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression
于 2016-10-04T16:21:32.003 回答