d[key]
Return the item of d with key key. Raises a KeyError if key is not in the map.
If a subclass of dict defines a method __missing__(), if the key key is not present, the d[key] operation calls that method with the key key as argument. The d[key] operation then returns or raises whatever is returned or raised by the __missing__(key) call if the key is not present. No other operations or methods invoke __missing__(). If __missing__() is not defined, KeyError is raised. __missing__() must be a method; it cannot be an instance variable. [...]
以及get(key[, default])
Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a 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执行额外的解包元组!
重要吗?我不知道。:-)