在iteritems中修改python列表会修改dict本身

时间:2015-07-14 11:45:01

标签: python django for-loop dictionary

dict = {1:[1,1,1], 2:[2,2,2]}
mylist = []

print dict

for key, value in dict.iteritems():
    mylist.append(value)

for item in mylist:
    a = item[0]+ item[1]
    item.append(a)

print dict

在操作之前打印dict的结果是

{1: [1, 1, 1], 2: [2, 2, 2]}

在iteritems之后执行此操作

{1: [1, 1, 1, 2], 2: [2, 2, 2, 4]}

为什么dict会被修改?

1 个答案:

答案 0 :(得分:1)

您正在更改dict的值列表,而不是列表的副本

for key, value in dict.iteritems():
    mylist.append(value)

id(mylist[0])
70976616
id(dict[1])
70976616

dict [1]和mylist [0]都引用相同的内存空间,因此只要它们引用它,内存空间的任何变化都会影响它们

dict[1]
[1, 1, 1, 2]
mylist[0]
[1, 1, 1, 2]

您可以使用复制,深层复制等来复制列表

dict = {1:[1,1,1], 2:[2,2,2]}
mylist = []

print dict

for key, value in dict.iteritems():
    mylist.append(value)

for item in mylist:
    a = item[0]+ item[1]
    item=item+[a] # this first evaluates the RHS creates a new memory reference and assigns it to item

print dict