私信  •  关注

fragilewindows XU Bin

fragilewindows XU Bin 最近创建的主题
fragilewindows XU Bin 最近回复了

如果需要一行:

list_of_dict = [{} for i in range(list_len)]

你误解了巨蟒 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