2014-12-01 4 views
-3

У меня есть такой код, словарь х должен быть создан вне контура для:Обновление словаря в цикл

one = [1,3,3,4,5,6] 
x = {'x': {}, 'a': 1} 
t = [] 
for i in one: 
    x['x'] = {'z': i} 
    t.append(x) 

Почему i`m получаю это:

[{'a': 1, 'x': {'z': 6}}, {'a': 1, 'x': {'z': 6}}, {'a': 1, 'x': {'z': 6}}, {'a': 1, 'x': {'z': 6}}, {'a': 1, 'x': {'z': 6}}, {'a': 1, 'x': {'z': 6}}] 

Я надеюсь, что это:

[{'a': 1, 'x': {'z': 1}}, {'a': 1, 'x': {'z': 3}}, {'a': 1, 'x': {'z': 3}}, {'a': 1, 'x': {'z': 4}}, {'a': 1, 'x': {'z': 5}}, {'a': 1, 'x': {'z': 6}}] 

ответ

1

Потому что вы на самом деле изменения же x объекта в цикле, так что все они указуют на то же OBJE кт. Вот почему все значения z в словаре имеют последнее значение.

Вы можете использовать следующий список понимание

t = [{'x': {'z': i}, 'a':1} for i in one] 

Выходной

>>> t 
[{'x': {'z': 1}, 'a': 1}, 
{'x': {'z': 3}, 'a': 1}, 
{'x': {'z': 3}, 'a': 1}, 
{'x': {'z': 4}, 'a': 1}, 
{'x': {'z': 5}, 'a': 1}, 
{'x': {'z': 6}, 'a': 1}] 
1

У вас есть один x объект вы модифицирующие и повторно добавить его к t. Другими словами, эта строка: x['x'] = {'z': i} не создает новый объект, он ее модифицирует. После цикла список содержит шесть ссылок на один и тот же объект.

0
one = [1,3,3,4,5,6] 

t = [] 
for i in one: 
    t.append({'x': {'z': i}, 'a': 1}) # new/dict object each iteration 
print(t) 

[{'a': 1, 'x': {'z': 1}}, {'a': 1, 'x': {'z': 3}}, {'a': 1, 'x': {'z': 3}}, {'a': 1, 'x': {'z': 4}}, {'a': 1, 'x': {'z': 5}}, {'a': 1, 'x': {'z': 6}}]