Python字典数据结构,使用d[]还是d.get()?

27 投票
5 回答
18391 浏览
提问于 2025-04-17 03:34

在使用Python的字典数据结构(它包含键值对)时,如果我想从字典中获取某个值,我有两个选择:d[''] 和 g.get('key')。所以我现在有点困惑,不知道哪个更好,为什么呢?我对这两种方法都有一定了解,但在内存消耗和内存评估方面,哪种更好呢?

希望能得到一些积极的回复,

谢谢。

5 个回答

4

它们的区别在于,如果你查找的键不存在,使用 d[key] 会报错,显示 KeyError;而使用 d.get(key) 则会返回 None(如果你用 d.get(key, default),还可以返回一个你设定的默认值)。

在内存使用上,它们没有明显的区别。

6

如果字典里没有这个 'key'

那么用 d['key'] 去查找会报错,显示 KeyError

但是如果你用 d.get('key') 来查找,

它会返回 None,也就是表示没有找到。

45

来自Python库文档

d[key]
这个操作会返回字典d中与key对应的值。如果key不在字典里,就会抛出一个KeyError错误。

如果字典的子类定义了一个叫__missing__()的方法,当你用d[key]去查找一个不存在的key时,这个操作会调用__missing__()方法,并把key作为参数传进去。然后,d[key]会返回__missing__(key)调用的结果,或者抛出错误。如果没有定义__missing__(),就会抛出KeyError。需要注意的是,__missing__()必须是一个方法,不能是实例变量。

还有

get(key[, default])
这个操作会返回字典中key对应的值,如果key不存在,就返回default。如果没有提供default,它会默认返回None,所以这个方法不会抛出KeyError

这两者的区别在于返回的结果。当你请求一个不存在的键的值时,你可能想要:

  1. 抛出一个KeyError错误
  2. 调用一个回调函数
  3. 返回一个默认值

Python通过不同的方法提供了这些功能。

当用[]查找一个不存在的键时,会有性能损失,因为要么会调用_missing_,要么会抛出异常。而在键存在时,哪个更快呢?我查看了源代码(我用的是2.7.2版本)。在dictobject.c中,我们看到:

  • get调用了dict_get
  • []调用了dict_subscript

如果值存在,在dict_get中我们有

if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
    return NULL;

if (!PyString_CheckExact(key) ||
    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    hash = PyObject_Hash(key);
    if (hash == -1)
        return NULL;
}
ep = (mp->ma_lookup)(mp, key, hash);

而在dict_subscript中我们有

assert(mp->ma_table != NULL);
if (!PyString_CheckExact(key) ||
    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    hash = PyObject_Hash(key);
    if (hash == -1)
        return NULL;
ep = (mp->ma_lookup)(mp, key, hash);

唯一的区别是get多做了一次元组解包!

这重要吗?我也不知道。:-)

撰写回答