所以,我正在研究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]]
我有一个理论,其中汽车数组使用一些指向变量空间的指针。
有没有人对此有可能的解释? 谢谢
答案 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