将元素分配给2D列表也会更改另一个列表

时间:2014-09-21 06:27:30

标签: python list python-2.7

我需要创建list1,其中包含另一组包含8个元素的列表。然后将这些附加到第二个列表,其中最后一个元素被更改。 我有点困惑,因为当我尝试更改最后一个元素时,它会更改两个列表的最后一个元素。

对此的任何帮助都将非常感激:

from random import random

list1 = []
list2 = []

for x in xrange(10):

   a, b, c, d, e, f, g = [random() for i in xrange(7)]

   list1.append([x, a, b, c,  d, e, f, g])

for y in xrange(len(list1)):

   list2.append(list1[y])
   print "Index: ", y, "\tlist1: ", list1[y][7]
   print "Index: ", y, "\tlist2: ", list2[y][7]

   list2[y][7] = "Value for list2 only"

   print "Index: ", y, "\tlist1: ", list1[y][7]
   print "Index: ", y, "\tlist2: ", list2[y][7]

1 个答案:

答案 0 :(得分:1)

替换:

list2.append(list1[y])

使用:

list2.append(list1[y][:])

原始代码的问题是python没有将list1[y]的数据附加到list2的末尾。相反,python附加了一个指向list1[y]的指针。更改两个地方的数据,因为它是相同的数据,所以两个地方都会出现更改。

解决方案是使用list1[y][:]告诉python复制数据。

如果没有列表列表,您可以更简单地看到此效果:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> b = a
>>> b[0] = 99
>>> a
[99, 1, 2, 3, 4, 5, 6, 7]

相比之下:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> b = a[:]
>>> b[0] = 99
>>> a
[0, 1, 2, 3, 4, 5, 6, 7]