ifi*_*hat 16 python data-structures
使用Python Dictionary DataStructure(包含键值对)如果我想从我的词典中检索一些值我有两个选项d ['']和g.get('key')所以我现在很困惑哪个更好,为什么?我对某种方式都有所了解,但是当涉及到内存消耗和内存评估哪个更好?
希望得到一些积极的回复,
问候.
Ray*_*oal 31
d[key]
用钥匙键 返回d 项.引发KeyErrorif 键不在地图中.如果字典的子类定义了一个方法
__missing__(),如果键键不存在时,在d[key]操作调用与所述密钥方法键作为参数.该d[key]操作然后返回或引发任何退回或募集的__missing__(key)通话如果该键不存在.没有其他操作或方法调用__missing__().如果__missing__()未定义,KeyError则引发.__missing__()必须是一种方法; 它不能是实例变量.[...]
和
get(key[, default])
如果key在字典中,则 返回key的值,否则返回default.如果未给出default,则默认为,因此此方法永远不会引发a .NoneKeyError
不同之处在于回报价值.当您要求与不存在的键对应的值时,您要么想要
KeyError凸起的Python通过多种方法提供不同的功能.
在[]找不到密钥时,无论是在调用_missing_还是引发异常时,都会遇到性能损失.至于密钥IS出现时哪一个更快,我检查了源代码.(这次检查使用了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);
Run Code Online (Sandbox Code Playgroud)
而且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);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是,get额外的解包元组!
重大?我不知道.:-)