Проблема с назначением значения по ключу в списке словарей - PullRequest
1 голос
/ 30 января 2020

У меня есть список словарей, подобных этому:

dictionary_list = [{"id":""},{"id":""}]

РЕДАКТИРОВАТЬ: поскольку намерение состоит в том, чтобы разрешить переменное количество элементов в списке, список фактически построен следующим образом:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)

РЕДАКТИРОВАТЬ: я также попробовал следующий подход, предложенный сообществом:

shelves = 2
book = {"id":""}
dictionary_list = [book for i in range(shelves)]

Я пытаюсь присвоить «id» первого элемента «apple» следующим образом:

dictionary_list[0]["id"] = "apple"

Результат:

print dictionary_list
>> [{"id":"apple"},{"id":"apple"}]

Конечно, когда я назначаю "orange" на dictionary_list[1]["id"], оба идентификатора меняются на оранжевый.

Что здесь происходит? Спасибо!

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Это происходит потому, что вы инициировали свой словарь следующим образом:

dictionary_list = [{"id":""}]*2

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

>>> id(dictionary_list[0])
3055225778896
>>> id(dictionary_list[1])
3055225778896

Это можно исправить, запустив словарь следующим образом:

dictionary_list = [{"id":""} for i in range(2)]

РЕДАКТИРОВАТЬ:

Учитывая новый код:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book)

Мы можем видеть, что одна и та же ссылка book добавляется к dictionary_list каждый раз, когда выполняется for-l oop. Мы могли бы изменить это для работы следующим образом:

shelves = 2
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append({"id":""})

Или:

shelves = 2
book = {"id":""}
dictionary_list = []
for counter in range(shelves):
    dictionary_list.append(book.copy())
1 голос
/ 30 января 2020

Вы добавляете один и тот же объект книги несколько раз. Вам нужно либо каждый раз создавать объект dict внутри l oop, либо добавлять book.copy() к списку.

Как это

for counter in range(shelves):
    dictionary_list.append(book.copy())

Или как это

dictionary_list = [{"id":""} for counter in range(shelves)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...