Python Dictionary DataStructure, какой метод d [] или d.get()?

Хотя я использую Python Dictionary DataStructure (который содержит пару "ключ-значение"), если я хочу получить какое-то значение из моего Словаря, у меня есть два варианта: d [''] и g.get('key'), поэтому теперь я запутался, что лучше и Зачем?? Я так понимаю, но когда дело доходит до потребления памяти и оценки в памяти, какая из них лучше?

Надеясь на положительный ответ,

С уважением.

Ответ 1

Из документов библиотеки Python

d[key]
Верните элемент d с помощью ключевого ключа. Повышает значение KeyError если на карте нет ключа.

Если подкласс dict определяет метод __missing__(), если ключевой ключ отсутствует, операция d[key] вызывает этот метод с ключевым ключом в качестве аргумента. Операция d[key] возвращает или поднимает все, что возвращается или поднимается __missing__(key) если ключ отсутствует. Никакие другие операции или методы не вызывают __missing__(). Если __missing__() не определен, KeyError поднимается. __missing__() должен быть методом; он не может быть переменной экземпляра. [...]

а также

get(key[, default])
Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равно None, так что этот метод никогда не вызывает KeyError.

Разница заключается в возвращаемом значении. Когда вы запрашиваете значение, соответствующее несуществующему ключу, вы либо хотите

  1. KeyError
  2. Обратный вызов
  3. Возвращаемое значение по умолчанию

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 делает дополнительный распакованный кортеж!

Значительное? Понятия не имею. :-)

Ответ 2

Если 'key' не существует в словаре,

d['key']

будет бросать KeyError, в то время как

d.get('key')

вернет None.

Ответ 3

Разница в том, что если ключ отсутствует, d[key] KeyError исключение KeyError, тогда как d.get(key) возвращает Noned.get(key, default) возвращает значение по умолчанию).

Нет заметных различий в требованиях к памяти.

Ответ 4

Они разные, особенно если ключ отсутствует в вашем словаре (см. Здесь)

d[key]

Верните элемент d с помощью ключевого ключа. Повышает значение KeyError, если на карте нет ключа.

get(key[, default])

Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равно None, так что этот метод никогда не вызывает KeyError.

Ответ 5

Оба они ведут себя одинаково, если ключ существует. Но если ключ не найден, d['key'] KeyError исключение KeyError, тогда как d.get('key') вернет None. Вы также можете предоставить второй аргумент методу get, который будет возвращен в не найденное условие: d.get('key', '') вернет пустую строку, если ключ не найден.