«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему `dict.fromkeys()` создает общие изменяемые объекты в Python?

Почему `dict.fromkeys()` создает общие изменяемые объекты в Python?

Опубликовано 8 ноября 2024 г.
Просматривать:568

 Why does `dict.fromkeys()` create shared mutable objects in Python?

Создание словарей и изменяемые объекты: удивительное поведение с 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