Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python dict.update vs.subscript添加单个键/值对_Python_Dictionary - Fatal编程技术网

python dict.update vs.subscript添加单个键/值对

python dict.update vs.subscript添加单个键/值对,python,dictionary,Python,Dictionary,每学期至少有一名Python学生使用dict.update()添加一个键/值对,即: mydict.update({'newkey':'newvalue'}) 而不是 mydict['newkey'] = 'newvalue' 我不教这种方法,也不知道他们在哪里找到了这样的例子,但我告诉他们不要这样做,因为它效率较低(可能会创建一个新的2元素dict),而且因为它不标准 老实说,我能理解使用可视方法而不是这种语法的愿望——它可能感觉与其他方法调用更一致。但我认为这看起来像是一个新手的做法 在

每学期至少有一名Python学生使用
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:没有。堆栈溢出是针对特定的编程问题,这就是(
[]
vs
update
)。Programmers.SE在其常见问题解答中明确指出,它与“实现问题或编程工具”无关。有趣的是,7年后,关闭的原因似乎是虚假的,而问题都与编程有关。好吧,这就解决了,谢谢!我需要开始使用TimeIt执行索引更新所花费的时间在任何有意义的应用程序中都是无关的。[]=s的可读性更为重要。我觉得更新版本不太明显。@PeterWooster:我同意可读性更重要,但我个人认为
更新
更可读。但你可能从未编写过Fortran:)@PeterWooster:非常正确。@PeterWooster:这不是我更喜欢
更新的原因。我更喜欢
更新
,因为它不会在每一行重复
配置
,引用也更少。