使用字符串更新Python字典以设置(键,值)失败

问题描述 投票:1回答:1

dict.update([other])

使用其他键中的键/值对更新字典,覆盖现有键。返回无。

update()接受另一个字典对象或一对键/值对的迭代(作为元组或长度为2的其他迭代)。如果指定了关键字参数,则使用这些键/值对更新字典:d.update(red = 1,blue = 2)。

>>> {}.update( ("key", "value") )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required

那么为什么Python显然会尝试使用元组的第一个字符串?

python dictionary grammar iterable
1个回答
3
投票

直接的解决方案是这样的:唯一的参数other是可选的,是一个可迭代的元组(或其他长度为2的迭代)。

没有争论(它是可选的,因为当你不需要它时:-):

>>> d = {}
>>> d.update()
>>> d
{}

带有元组的列表(不要将它与包含可选参数的方括号混淆!):

>>> d = {}
>>> d.update([("key", "value")])
>>> d
{'key': 'value'}

根据Python glossary on iterables,元组(作为所有序列类型)也是可迭代的,但是这会失败:

>>> d = {}
>>> d.update((("key", "value")))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required

Python documentation on tuple再次解决了这个谜团:

请注意,它实际上是一个逗号,它产生一个元组,而不是括号。括号是可选的,除了空元组情况,或者需要它们以避免语法歧义。

(None)根本不是一个元组,但(None,)是:

>>> type( (None,) )
<class 'tuple'>

这样可行:

>>> d = {}
>>> d.update((("key", "value"),))
>>> d
{'key': 'value'}
>>>

但事实并非如此

>>> d = {}
>>> d.update(("key", "value"),)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required

因为所说的句法歧义(逗号是函数参数分隔符)。

© www.soinside.com 2019 - 2024. All rights reserved.