【发布时间】:2012-06-21 00:06:00
【问题描述】:
我在 Python 方面有一些经验,但我正在参加 Udacity 计算机科学课程以填补我所学知识的空白并补充我已经知道的知识。本课程讨论了一个哈希表查找函数,如果键不在哈希表中,则该函数返回 None 作为键的值。当键不存在时,Python 的字典类型会抛出 KeyError,因此课程说在获取其值之前使用 key in mydict。
我想知道这样做是否更好:
mydefaultval = 75
key = ..
mydict = ..
if key in mydict:
val = mydict[key]
else:
val = mydefaultval
.. 或
mydefaultval = 75
key = ..
mydict = ..
try:
val = mydict[key]
except KeyError:
val = mydefaultval
我想 Python 要检查密钥是否存在,它必须在字典中找到它。如果我然后抓住那个键的值,它必须做同样的事情两次。我这样想是正确的,还是 Python 会做其他事情?
【问题讨论】:
-
Ned 给了你正确的答案 - 但值得建议你不要隐藏内置插件(例如命名一个 dict - dict)。一般来说,Python 遵循“请求宽恕胜过许可”,而不是“先看再跳”的方法。即,先别看能不能做,试着做,做不到再处理。
-
@JonClements,对不起,忘记了。我只是想快速输入示例。
-
虽然在你的情况下还有其他答案,但 Jon Clements 是对的 - 你几乎总是最好抓住异常 - 首先,它通常显示正确的优先级 - 你想要处理当一切都如你所愿首先,不要考虑支票。它还避免了各种情况下的竞争条件,这总是值得做的,因为如果它们滑入,它们是微妙而烦人的错误。
-
@Lattyware,这是我没有想到的另一件事。你是说在检查它的存在之后但在获取它的值之前,有可能删除密钥,对吧?
-
是的 - 对于 dict 键之类的东西,这通常不是问题,但在涉及线程,或写入/读取文件的情况下,这是一个严重的问题。一般来说,最好坚持处理异常而不是事先检查,除非你绝对需要(例如,如果那段代码是一个重要的瓶颈并且异常情况实际上发生了很多 - 尽管注意异常情况是否发生最多有时,您也许可以交换例外情况作为替代方案 - 但显然,除非必须,否则永远不要优化。)。
标签: python hash hashmap hashtable