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