列表索引更改多个元素

时间:2014-04-25 22:13:21

标签: python list indexing

我找不到任何与我的问题相符的内容,所以希望这在某处并没有被提及过,而且我找到它太愚蠢了。

thelist = []
a = [0]
for i in range(5):
    thelist.append(a)
print(thelist)

此时,程序返回[[0],[0],[0],[0],[0]]

thelist[0].append(1)
print(thelist)

在追加这个之后我会期望它返回相同的但是修改了第一个元素,如下所示:

[[0, 1], [0], [0], [0], [0]]

实际发生的是,每个元素都以相同的方式被修改,我得到了以下内容。

[[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]

我发现,如果我将第2行中的a替换为a的值,一切正常。但是,当我多次附加一个变量时,为什么这不起作用?

3 个答案:

答案 0 :(得分:0)

创建列表时,它会在每个位置保存对同一对象(a)的引用。当您附加到第一个元素时,它实际上附加到所有" thelist"插槽。您需要做的是在构造期间对对象进行深层复制:

thelist = []
a = [0]
for i in range(5):
    thelist.append(list(a))
print(thelist)

然后,以下附加内容将按预期工作。

答案 1 :(得分:0)

thelista都是列表。因此,在for循环中,您将列表附加到另一个列表

案例1:a是一个列表

thelist = []
a = [0]
for i in range(5):
    thelist.append(a)
print(thelist)

[[0], [0], [0], [0], [0]]

案例2:a不是列表而是变量

thelist = []
a = 0
for i in range(5):
    thelist.append(a)
print(thelist)


[0, 0, 0, 0, 0]

答案 2 :(得分:0)

a是列表中每个项目都指向的对象。

如果希望列表中的每个项目都是不同的对象(具有相同的值),则应在分配之前创建新对象。最简单的方法是:

for i in range(5):
    thelist.append(list(a))

list函数接收一个列表并返回一个具有相同内部值的新实例。所以你不会每次都改变整个阵列。