Python Словарь DataStructure какой метод d [] или d.get ()? - PullRequest
16 голосов
/ 03 октября 2011

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

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

Привет.

Ответы [ 5 ]

31 голосов
/ 03 октября 2011

Из Документов библиотеки 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.

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

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

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

Существенная? Я понятия не имею. : -)

4 голосов
/ 03 октября 2011

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

d['key']

выдаст KeyError, а

d.get('key')

вернет None.

3 голосов
/ 03 октября 2011

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

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

0 голосов
/ 03 октября 2011

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

0 голосов
/ 03 октября 2011

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

d[key]

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

get(key[, default])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...