【问题标题】:List index changes multiple elements列表索引更改多个元素
【发布时间】:2014-04-25 22:13:21
【问题描述】:

我找不到任何符合我的问题的东西,所以希望这不是已经在某处提到的,我只是太愚蠢了,找不到它。

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 的值,一切正常。但是为什么当我多次附加一个变量时这不起作用??

【问题讨论】:

  • 倒数第二行。我的意思是第 4 行。

标签: python list indexing


【解决方案1】:

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

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

然后下面的附加将按需要工作。

【讨论】:

  • 非常感谢,我想很明显我没有那么有经验,因为我不知道这会产生参考 :)
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    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]
    

    【讨论】:

    • 谢谢,但这并不是我问题的真正答案;)它应该是列表中的列表。
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-12-12
    • 2014-12-12
    • 2013-09-27
    相关资源
    最近更新 更多