Почему dict.setdefault (значение, []). Append (ключ) работает? - PullRequest
0 голосов
/ 27 октября 2019

Примечание: это было частью гораздо большего, более сложного фрагмента кода, где эта единственная строка кода имела смысл с учетом контекста. Я знаю, что могу просто написать 1 в списке.

Код, на который я ссылаюсь, взят из другого вопроса: Как реализовать эффективную двунаправленную хэш-таблицу?

В любом случае, я не понимаю, почемуВозвращаемое значение - список, к которому можно добавить, и почему это изменение отражено в списке, содержащемся в словаре. Насколько я знаю, возвращаемое значение было в некоторой степени копией списка, а не того же самого списка в словаре:

>>> dict = {}
>>> dict.setdefault("a",[]).append(1)
>>> print(dict)
>>> {"a": [1]}

Сначала я думал, что это потому, что возвращенный список возвращается только послевыполнение строки, которое, казалось, имело большой смысл, поэтому чтобы проверить это, я присвоил результат dict.setdefault ("a", []) переменной:

>>> dict = {}
>>> l = dict.setdefault("a",[])
>>> l.append(1)
>>> print(l)
>>> [1]
>>> print(dict)
>>> {"a": [1]}

Что ещенезнакомец, это то, что добавление в список напрямую не работает. Под прямым понятием я имею в виду следующее:

>>> dict = {}
>>> dict.setdefault("a",[].append(1))
>>> print(dict)
>>> {"a": None}    

Так что я не ожидал, что это станет возможным, это то, что на самом деле произошло (изменение возвращаемого значения с внесением этого изменения в копию этого значения), и чтоЯ подумал, что это невозможно (добавление непосредственно в список).

Если кто-то знает, почему это так, и в документации по Python я могу прочитать больше об этом поведении, чтобы углубить мое понимание, чтобудет принята с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 27 октября 2019

dict.setdefault (ключ, значение) возвращает значение, соответствующее ключу, создавая ключ и значение в dict при необходимости. Таким образом, в этом примере список создается и возвращается, а затем к нему добавляется список.

>>> d = {}
>>> d.setdefault('a', [])
[]

>>> d = {}
>>> d.setdefault('a', []).append(1)
>>> d
{'a': [1]}

Из документов :

setdefault (ключ [, по умолчанию])

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

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