странное поведение со списком словарей в python

Вот простой код, который выполняет операции над списками:

>>> a = [0] * 5 >>> a [0, 0, 0, 0, 0] >>> a[0] = 5 >>> a [5, 0, 0, 0, 0] >>> 

На данный момент ничего ненормального.

Теперь я пытаюсь сделать то же самое со списком словарей, а не с целым числом:

 >>> a = [{}] * 5 >>> a [{}, {}, {}, {}, {}] >>> a[0]['b'] = 4 >>> a [{'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}] >>> 

Я не понимаю, почему все элементы моего списка изменены …

Может ли кто-нибудь сказать мне, почему? А также обеспечить обходное решение?

  • Как обрабатывать 3 уровня разрешений для полей в структуре Django REST
  • Как получить текущие доступные графические процессоры в тензорном потоке?
  • очистка при использовании исключений и файлов в python
  • Как очистить мою установку Python для нового запуска
  • Когда использовать абсолютный импорт
  • IndexError: индекс индекса вне диапазона и python
  • Django & South: добавление нового поля, но DatabaseError происходит, «таблица уже существует»
  • Python для поведения цикла и итератора
  • 2 Solutions collect form web for “странное поведение со списком словарей в python”

    Это не странно.


    Временное решение:

     a = [{} for i in xrange(5)] 

    […] * 5 создает один и список из пяти указателей на это

    0 – неизменяемое целое число. Вы не можете изменить его, вы можете просто заменить его другим целым числом (например, a[0] = 5 ). Тогда это другое целое число.

    {} – изменяемый словарь. Вы его изменяете: a[0]['b'] = 4 . Это всегда один и тот же словарь.

    Попробуй это,

     a = map([].append, {} for i in xrange(3)) 
    Interesting Posts

    Как сделать словарь python, который возвращает ключ для ключей, отсутствующих в словаре, вместо того, чтобы поднимать KeyError?

    Как подсчитать значения в определенном диапазоне в массиве Numpy?

    Google App Engine: Webtest, имитирующий вход в систему пользователя и администратора

    Matplotlib – Как удалить определенную линию или кривую

    Как объявить значения по умолчанию для переменных экземпляра в Python?

    Django ModelChoiceField не имеет плюсовой кнопки

    Регулярное выражение для соответствия разделенному запятыми списку ключа = значение, в котором значение может содержать запятые

    Как я могу украсить все функции класса, не набирая его снова и снова для каждого добавленного метода? Python

    Добавление пробелов к элементам в списке (Python)

    Как я могу покрасить некоторые вещи в Emacs?

    Не удалось выполнить функцию readlink ()

    Ошибка сегментации Python?

    Как проверить, является ли данная строка Python подстрокой другого?

    Декодирование экранированных символов в URL

    Вернуться к python 2.7 Anaconda

    Python - лучший язык программирования в мире.