Добавление словаря в список в цикле Python

Я базовый программист на python, поэтому, надеюсь, ответ на мой вопрос будет легким. Я пытаюсь взять словарь и добавить его в список. Затем словарь изменяет значения, а затем снова добавляется в цикле. Кажется, что каждый раз, когда я это делаю, все словари в списке меняют свои значения в соответствии с тем, что было просто добавлено. Например:

>>> dict = {}
>>> list = []
>>> for x in range(0,100):
...     dict[1] = x
...     list.append(dict)
... 
>>> print list

Я бы предположил, что результат будет [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}], но вместо этого я получил:

[{1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}]

Любая помощь очень ценится.

Ответы

Ответ 1

Вам нужно добавить копию, иначе вы просто добавляете ссылки на один и тот же словарь снова и снова:

yourlist.append(yourdict.copy())

Я использовал yourdict и yourlist вместо dict и list; вы не хотите замаскировать встроенные типы.

Ответ 2

Когда вы создаете словарь adict вне цикла, вы добавляете тот же самый dict в свой alist список. Это означает, что все копии указывают на один и тот же словарь, и вы получаете последнее значение {1:99} каждый раз. Просто создайте каждый словарь внутри цикла, и теперь у вас есть 100 разных словарей.

alist = []
for x in range(100):
    adict = {1:x}
    alist.append(adict)
print(alist)

Ответ 3

Вы также можете использовать zip и составить список, чтобы делать то, что вам нужно.

Если вы хотите, чтобы значения dict начинались с одного использования range(1,100)

l = [dict(zip([1],[x])) for x in range(1,100)]

Ответ 4

Просто поставьте dict = {} внутри цикла.

>>> dict = {}
>>> list = []
>>> for x in range(0, 100):
       dict[1] = x
       list.append(dict)
       dict = {}

>>> print list