Ответ 1
Из документов библиотеки Python
d[key]
Верните элемент d с помощью ключевого ключа. Повышает значениеKeyError
если на карте нет ключа.Если подкласс dict определяет метод
__missing__()
, если ключевой ключ отсутствует, операцияd[key]
вызывает этот метод с ключевым ключом в качестве аргумента. Операцияd[key]
возвращает или поднимает все, что возвращается или поднимается__missing__(key)
если ключ отсутствует. Никакие другие операции или методы не вызывают__missing__()
. Если__missing__()
не определен,KeyError
поднимается.__missing__()
должен быть методом; он не может быть переменной экземпляра. [...]
а также
get(key[, default])
Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равноNone
, так что этот метод никогда не вызываетKeyError
.
Разница заключается в возвращаемом значении. Когда вы запрашиваете значение, соответствующее несуществующему ключу, вы либо хотите
-
KeyError
- Обратный вызов
- Возвращаемое значение по умолчанию
Python предоставляет различные функции с помощью нескольких методов.
При нажатии клавиши []
когда ключ не будет найден, при вызове _missing_
или сборе исключения _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
делает дополнительный распакованный кортеж!
Значительное? Понятия не имею. :-)