我有这样的代码,字典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}}]
答案 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}}]