你误解了巨蟒
list
对象。它类似于C
pointer-array
. 它实际上并不“复制”您附加到它的对象。相反,它只是存储一个指向该对象的“指针”。
请尝试以下代码:
>>> d={}
>>> dlist=[]
>>> for i in xrange(0,3):
d['data']=i
dlist.append(d)
print(d)
{'data': 0}
{'data': 1}
{'data': 2}
>>> print(dlist)
[{'data': 2}, {'data': 2}, {'data': 2}]
那么为什么呢?
print(dlist)
不一样
print(d)
?
下面的代码显示了原因:
>>> for i in dlist:
print "the list item point to object:", id(i)
the list item point to object: 47472232
the list item point to object: 47472232
the list item point to object: 47472232
所以你可以看到
dlist
实际上是指向同一个
dict
对象。
这个问题的真正答案是通过使用
d.copy()
.
>>> dlist=[]
>>> for i in xrange(0,3):
d['data']=i
dlist.append(d.copy())
print(d)
{'data': 0}
{'data': 1}
{'data': 2}
>>> print dlist
[{'data': 0}, {'data': 1}, {'data': 2}]
试试
id()
技巧,你可以看到列表项实际上指向完全不同的对象。
>>> for i in dlist:
print "the list item points to object:", id(i)
the list item points to object: 33861576
the list item points to object: 47472520
the list item points to object: 47458120