这个列表操作出了什么问题?

时间:2013-10-17 13:13:22

标签: python

我正在使用Python中的列表进行操作。

In [52]: myList = [1,2,3,4,5]
In [54]: c=[[]]*10

In [55]: for i, elem1 in enumerate(myList):
   ....:     b = [elem1 + elem2 for elem2 in range(10)]
   ....:     minSum, minSumIndex= min((val, idx) for (idx, val) in enumerate(b))
   ....:     c[minSumIndex].append(elem1)

期待 myList中的所有元素都被追加到c[0],因为elem1+1总是给出最小的总和。

print c[0]
[1, 2, 3, 4, 5]

print c[1]
[]

print c[2]
[]

...

然而,我最终得到了这个:

In [56]: shape(c)
Out[56]: (10, 5)

In [57]: print c[0]
[1, 2, 3, 4, 5]

In [58]: print c[1]
[1, 2, 3, 4, 5]

In [59]: print c[2]
[1, 2, 3, 4, 5]

In [60]: print c[3]
[1, 2, 3, 4, 5]

In [61]: print c[4]
[1, 2, 3, 4, 5]

In [62]: print c[5]
[1, 2, 3, 4, 5]

出了什么问题?

2 个答案:

答案 0 :(得分:4)

你的困惑的根源在这一行

c=[[]]*10

在这里,您要创建一个列表,其中列出了对同一个(最初为空)列表的十个引用。因此,当您稍后追加到c[0]中的列表时,您还会附加到c中的每个其他列表。尝试

c = [ [] for _ in range(10) ]

这将创建10个新列表十次,因此您将不会有相同的引用问题。

答案 1 :(得分:0)

c中的列表都是相同的对象。 你至少需要这样做:

c = [[] for i in xrange(10)]