我注意到你可以做两件事来更新字典,而且它们似乎有相同的结果:
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体,我不认为我曾经遇到过这种情况