Создание словарей и изменяемые объекты: удивительное поведение с fromkeys
При создании словарей с использованием dict.fromkeys() в Python может возникнуть непредвиденная ситуация возникают, когда изменяемые объекты используются в качестве значений. Рассмотрим следующий пример:
xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)
Несмотря на создание двух отдельных объектов списка в качестве значений для ключей словаря 0 и 1, добавление элемента в список с индексом 0 также добавляет его в список с индексом 1. Это происходит потому, что привязка fromkeys каждый ключ соответствует одной и той же ссылке изменяемого объекта, что приводит к общим модификациям.
Напротив, понимание словаря в Python 3.2 демонстрирует разные поведение:
xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)
Здесь каждый ключ привязан к отдельному объекту списка. Добавление элемента в список с индексом 0 не влияет на список с индексом 1.
В чем разница?
Поведение fromkeys можно понять, рассмотрев следующий эквивалентный код:
a = []
xs = dict.fromkeys(range(2), a)
Каждый ключ в результирующем словаре ссылается на один и тот же объект, что приводит к наблюдаемым общим изменениям.
Для достижения желаемого поведения отдельные изменяемые объекты для каждого ключа, используйте понимание словаря или, для Python 2.6 и более ранних версий без понимания словаря, используйте dict() с генератором выражение:
xs = dict((i, []) for i in range(2))
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3