python dict.update vs.subscript添加单个键/值对
每学期至少有一名Python学生使用python dict.update vs.subscript添加单个键/值对,python,dictionary,Python,Dictionary,每学期至少有一名Python学生使用dict.update()添加一个键/值对,即: mydict.update({'newkey':'newvalue'}) 而不是 mydict['newkey'] = 'newvalue' 我不教这种方法,也不知道他们在哪里找到了这样的例子,但我告诉他们不要这样做,因为它效率较低(可能会创建一个新的2元素dict),而且因为它不标准 老实说,我能理解使用可视方法而不是这种语法的愿望——它可能感觉与其他方法调用更一致。但我认为这看起来像是一个新手的做法 在
dict.update()
添加一个键/值对,即:
mydict.update({'newkey':'newvalue'})
而不是
mydict['newkey'] = 'newvalue'
我不教这种方法,也不知道他们在哪里找到了这样的例子,但我告诉他们不要这样做,因为它效率较低(可能会创建一个新的2元素dict),而且因为它不标准
老实说,我能理解使用可视方法而不是这种语法的愿望——它可能感觉与其他方法调用更一致。但我认为这看起来像是一个新手的做法
在这一点上,有人能提供什么智慧吗 直接更新密钥的速度是原来的三倍,但YMMV:
$ 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
有些人认为[]=在面向对象语言或其他任何语言中都不是有效的语法元素。我记得几十年前在APL语言开发公司工作时听到过这个观点。这种语法是Fortran的一种保留 我个人并不赞同这种观点,我对索引分配非常满意。但也有人认为,真正的方法调用更好。当然,有多个解决方案总是好的 编辑:
这里真正的问题是可读性,而不是性能,索引赋值一直存在,因为许多人发现赋值更容易阅读,即使理论上不太正确。基准测试表明您对其性能影响的怀疑似乎是正确的:
$python-m timeit-s'd={“key”:“value”}'d[“key”]=“value”'
10000000个回路,最好为3个:每个回路0.0741 usec
$python-m timeit-s'd={“key”:“value”}'d.update(key=“value”)'
1000000个循环,最好3个:每个循环0.294 usec
$python-m timeit-s'd={“key”:“value”}'d.update({“key”:“value”})'
1000000个循环,最好3个:每个循环0.461 usec
也就是说,在我的机器上,速度大约慢六倍。然而,如果您需要最高性能,Python已经不是一种您会使用的语言,因此我建议您在这种情况下使用可读性最好的语言。对于许多事情来说,这将是[]
的方式,尽管update
在这种情况下更具可读性:
configuration.update(
timeout=60,
host='example.com',
)
…或类似的问题。你的问题是什么?你是在问这样使用
update
是否是个好主意还是坏主意?是的,原因是什么。这不是一个教学问题。问题在于这种方法是否低效、不可取等等。教学部分只是一些背景。谢谢你的评论,那有什么区别呢?@CristianCiupitu:没有。堆栈溢出是针对特定的编程问题,这就是([]
vsupdate
)。Programmers.SE在其常见问题解答中明确指出,它与“实现问题或编程工具”无关。有趣的是,7年后,关闭的原因似乎是虚假的,而问题都与编程有关。好吧,这就解决了,谢谢!我需要开始使用TimeIt执行索引更新所花费的时间在任何有意义的应用程序中都是无关的。[]=s的可读性更为重要。我觉得更新版本不太明显。@PeterWooster:我同意可读性更重要,但我个人认为更新
更可读。但你可能从未编写过Fortran:)@PeterWooster:非常正确。@PeterWooster:这不是我更喜欢更新的原因。我更喜欢更新
,因为它不会在每一行重复配置
,引用也更少。