在for循环中更新字典

时间:2014-12-01 13:00:06

标签: python loops for-loop dictionary

我有这样的代码,字典x必须在循环外创建:

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

为什么我得到这个:

[{'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}}]

3 个答案:

答案 0 :(得分:1)

因为您实际上是在循环中修改相同的x对象,所以它们都指向同一个对象。这就是字典中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 :(得分:1)

您有一个x个对象,您正在修改并重新附加到t。换句话说,这一行:x['x'] = {'z': i}不会创建新对象,而是修改它。在循环之后,列表保持对同一单个对象的六个引用。

答案 2 :(得分: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}}]