python dict.update vs. 下标添加单个键值对

68 投票
3 回答
26576 浏览
提问于 2025-04-17 19:22

每个学期,我总会遇到至少一个学习Python的学生,他们用 dict.update() 方法来添加一个键值对,比如:

mydict.update({'newkey':'newvalue'})

而不是用

mydict['newkey'] = 'newvalue'

我并没有教他们这种方法,也不知道他们从哪里找到的例子,但我告诉他们不要这样做,因为这样效率低(可能会创建一个新的包含两个元素的字典),而且这不是标准做法。不过,这样说对吗?

老实说,我能理解他们想用一个明显的方法,而不是这种语法——这样可能和其他方法调用看起来更一致。但我觉得这看起来像是新手的做法。

3 个回答

8

有些人觉得 []= 这种写法在面向对象的语言里不算有效的语法,或者在其他语言中也是如此。我记得几十年前在开发APL语言的时候就听过这个说法。这个语法其实是从Fortran语言遗留下来的……

我个人并不认同这种观点,我对使用索引赋值感到很满意。不过也有人认为真正的方法调用会更好。当然,拥有多种解决方案总是好的。

编辑:这里真正的问题是可读性,而不是性能。虽然索引赋值在理论上可能不那么正确,但很多人觉得这种赋值方式更容易理解,因此它一直被使用。

13

直接更新这个关键字的速度快了三倍,但你的情况可能会有所不同:

$ python -m timeit 'd={"k":1}; d.update({"k":2})'
1000000 loops, best of 3: 0.669 usec per loop

$ python -m timeit 'd={"k":1}; d["k"] = 2'
1000000 loops, best of 3: 0.212 usec per loop
58

一个基准测试显示,你对它性能影响的怀疑似乎是正确的:

$ python -m timeit -s 'd = {"key": "value"}' 'd["key"] = "value"'
10000000 loops, best of 3: 0.0741 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update(key="value")'
1000000 loops, best of 3: 0.294 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update({"key": "value"})'
1000000 loops, best of 3: 0.461 usec per loop

也就是说,在我的电脑上,它大约慢了六倍。不过,Python本身就不是一个追求极致性能的语言,所以我建议在这种情况下使用最易读的方式。对于很多事情来说,使用[]的方式会更好,不过在像这样的情况下,update可能会更容易理解:

configuration.update(
    timeout=60,
    host='example.com',
)

…或者类似的东西。

撰写回答