在python中,当dict声明退出列表迭代时,将dict追加到for in迭代中的列表

在python中,当dict声明退出列表迭代时,将dict追加到for in迭代中的列表,python,Python,像下面一样,为什么最后的r不打印[{'k':1},{'k':2}] l = [1, 2] d = {} r = [] for el in l: d['k'] = el print '> ' + str(d) r.append(d) print r 输出: > {'k': 1} > {'k': 2} [{'k': 2}, {'k': 2}] 在追加操作之前,它会按所希望的方式打印,但是在将dict追加到列表之后,为什么它会重复追加最后一个元素?

像下面一样,为什么最后的r不打印
[{'k':1},{'k':2}]

l = [1, 2]
d = {}
r = []

for el in l:
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r  
输出:

> {'k': 1}
> {'k': 2}
[{'k': 2}, {'k': 2}]

在追加操作之前,它会按所希望的方式打印,但是在将dict追加到列表之后,为什么它会重复追加最后一个元素?

当您第二次通过循环时,您正在为同一个键分配一个新值

for el in l:
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r  
第一次通过循环时,
el
1
d['k']
设置为
1
,然后打印。然后将
d
附加到
r

通过循环的第二次,
el
2
d['k']
——同一词典的同一键的同一值——设置为
2
。然后同样的字典,
d
,被附加到
r

现在
r
和你说的一样

r = [d, d]
由于
d['k']
现在是
2
,所以在
r
列表中对
d
的两个引用都会产生
{'k':2}


如果希望它不同,则必须在每次循环中创建一个新字典

当您第二次通过循环时,您正在为同一个键指定一个新值

for el in l:
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r  
第一次通过循环时,
el
1
d['k']
设置为
1
,然后打印。然后将
d
附加到
r

通过循环的第二次,
el
2
d['k']
——同一词典的同一键的同一值——设置为
2
。然后同样的字典,
d
,被附加到
r

现在
r
和你说的一样

r = [d, d]
由于
d['k']
现在是
2
,所以在
r
列表中对
d
的两个引用都会产生
{'k':2}


如果希望它不同,则必须在每次循环中创建一个新字典

你就快到了。这只需要一个小的修复:

l = [1, 2]
r = []

for el in l:
    d = {}
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r 
值得思考的是,这里有一种更高级的方法,可以使用:


你就快到了。这只需要一个小的修复:

l = [1, 2]
r = []

for el in l:
    d = {}
    d['k'] = el
    print '> ' + str(d)
    r.append(d)

print r 
值得思考的是,这里有一种更高级的方法,可以使用: