Python字典数据结构,使用d[]还是d.get()?
在使用Python的字典数据结构(它包含键值对)时,如果我想从字典中获取某个值,我有两个选择:d[''] 和 g.get('key')。所以我现在有点困惑,不知道哪个更好,为什么呢?我对这两种方法都有一定了解,但在内存消耗和内存评估方面,哪种更好呢?
希望能得到一些积极的回复,
谢谢。
5 个回答
它们的区别在于,如果你查找的键不存在,使用 d[key]
会报错,显示 KeyError
;而使用 d.get(key)
则会返回 None
(如果你用 d.get(key, default)
,还可以返回一个你设定的默认值)。
在内存使用上,它们没有明显的区别。
如果字典里没有这个 'key'
,
那么用 d['key']
去查找会报错,显示 KeyError
。
但是如果你用 d.get('key')
来查找,
它会返回 None
,也就是表示没有找到。
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
。
这两者的区别在于返回的结果。当你请求一个不存在的键的值时,你可能想要:
- 抛出一个
KeyError
错误 - 调用一个回调函数
- 返回一个默认值
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
多做了一次元组解包!
这重要吗?我也不知道。:-)