当我在Python中创建列表列表时,为什么我的所有内部列表都获得相同的值?

时间:2015-12-10 13:31:31

标签: python arrays list pointers

所以,我正在研究Python,为我的项目工作制作数组列表。

示例代码:

var0 = 0
var1 = 0
car = [0,0]
listitem = [car[:] for i in range(10)]
for i in range(10):
    car[0] = var0 + i + 1
    car[1] = var1 + i
    listitem[i] = car
print listitem

正如逻辑所暗示的那样,我们期待输出如下:

[[1,0],[2,1],[3,2],[4,3],[5,4],[6,5],[7,6],[8,7],[9,8],[10,9]]

但输出如下:

[[10,9],[10,9],[10,9],[10,9],[10,9],[10,9],[10,9],[10,9],[10,9],[10,9]]

我有一个理论,其中汽车数组使用一些指向变量空间的指针。

有没有人对此有可能的解释? 谢谢

3 个答案:

答案 0 :(得分:2)

您正在回收循环中的car变量,因此listitem中的所有条目都指向同一个对象。

var0 = 0
var1 = 0
car = [0,0]
listitem = [car[:] for i in range(10)]
for i in range(10):
    car = listitem[i]
    car[0] = var0 + i + 1
    car[1] = var1 + i
    listitem[i] = car
print listitem

请参阅下面的@simon-fraser评论,了解有关原因的更多信息。

答案 1 :(得分:2)

当您运行此代码'listitem [i] = car'时,您将汽车的内存地址分配给listitem [i],并且汽车的地址每次都相同。在10次循环之后,listitem中的所有子项将指向相同的地址。如果您运行以下代码:

 for i in range(10):
    car[0] = var0 + i + 1
    car[1] = var1 + i
    listitem[i] = car
    print hex(id(listitem[i]))

你会得到答案。最后一次汽车的地址用[10,9]保存,所以所有的输出都是一样的

试试这个:

  for i in range(10):
    listitem[i]=[a,b]=[var0 + i + 1,var1 + i]

答案 2 :(得分:0)

实际上没有必要初始化listitem的所有元素,因为您可以附加到它。也无需使用变量car,因为您可以立即存储您在listitem

中创建的项目
var0 = 0
var1 = 0
listitem = []
for i in range(10):
    listitem.append([var0 + i + 1, var1 + i])
print listitem