什么时候在字典上使用键值对.更新方法?



我注意到你可以做两件事来更新字典,而且它们似乎有相同的结果:

a = {}
a.update({'foo': 1})
a = {}
a.update(foo = 1)

两者都导致一个字典的结果如下:

{'foo': 1}

是否有理由更喜欢使用字典或键/值对的更新方法?它们在功能上是完全相同的吗?还是存在一种语法可能导致的"陷阱"?

使用一个而不是另一个可能有不同的原因。例如:

>>> d = {}
>>> d.update(a=2)        # looks much cleaner
>>> d.update({'a': 2})   # We need to unnecessarily write a few more characters,

但是,如果我想更新一个非str类型的键:

>>> d = {}
>>> d.update(2='a')      # Gives a syntax error
>>> d.update({2: 'a'})   # is the only way

此外,您可以存储dict,所以如果您需要通过变量更新:

>>> u = {'a': 2}
>>> d = {}
>>> d.update(u)          # clean
>>> d.update(**u)        # Essentially same as using keyword argument form, but unnecessary

另一种情况是,当您手动更新某些键,但从变量更新其他键时,关键字参数形式更简洁,更短:

>>> u = {'a': 2}
>>> d = {}
>>> d.update(b=3, **u)
# Whereas to use `dict` form:
>>> d.update({'b': 3, **u})   # Introduces unnecessary clutter

是否有理由更喜欢使用字典或键/值对更新方法?

您已经有一个,例如,如果您有一个基本字典和另一个字典(来自常量或参数),那么dict1.update(dict2)是完全有意义的。

也有意义,如果你是动态生成第二个字典,例如dict1.update(zip(keys, values)).

它们在功能上完全相同吗?还是存在一个语法可能导致的"陷阱"?

关键字参数"form只适用于字符串键(在Python 3中,在Python 2中它也无意中适用于非字符串键)。甚至使用映射解包形式。它也不能与文字关键字一起使用,例如

d.update(assert=3)

是语法错误。

更普遍的

关键字表单本身是无用的

update调用中添加带有位置参数的关键字是有意义的,例如

d.update(d2, key=value)

,因为你已经背上了一个必要的电话。然而

d.update(key=value)

通常是[0],只是一种更复杂、更有限、和更慢的书写方式。

d['key'] = value
```:
```sh
❯ python3 -mtimeit -s "d = {'a': 'b'}" "d.update(c='d', e='f', g='h')"
2000000 loops, best of 5: 202 nsec per loop
❯ python3 -mtimeit -s "d = {'a': 'b'}" "d['c']='d'; d['e']='f'; d['g']='h'"
5000000 loops, best of 5: 62.2 nsec per loop

我不记得这些数字了(它们可能随着最近的版本而改变,因为有对字面字典的优化),但是当我几年前做这个测试时,你需要几十个键才能收支平衡。

[0]它可以在罕见的情况下很有用,当你需要在表达式上下文中更新字典时,例如lambda体,我不认为我曾经遇到过这种情况

最新更新