【问题标题】:appending a list to a list to make a list of lists causes a problem when wanting to change a value by using the list of lists's index: python将列表附加到列表以创建列表列表时,当想要通过使用列表的索引更改值时会出现问题:python
【发布时间】:2011-10-10 17:48:38
【问题描述】:

基本上,当通过使用 list.append() 将列表附加到另一个列表来创建列表列表时,似乎会出现问题。问题是整个列都更改为您为您提供的索引设置的值。例如这里的代码

b = [1,1,1]
c = []
c.append(b)
c.append(b)
c.append(b)
c[0][0] = 4

如果你打印 c 你会得到: [[4,1,1][4,1,1][4,1,1]] 代替 [[4,1,1][1,1,1][1,1,1]]

所以我的问题是,您如何才能得到右侧的列表,而不是实际发生的情况。

【问题讨论】:

    标签: python list append multidimensional-array


    【解决方案1】:

    每次添加列表时都创建一个新副本:

    b = [1,1,1]
    c = []
    c.append(list(b))
    c.append(list(b))
    c.append(list(b))
    c[0][0] = 4
    

    您遇到问题的原因是因为列表存储为实际列表对象的引用 - 因此您的c 版本有3 个相同引用的副本,都指向相同的实际 [1,1,1] 对象。使用list() 函数创建新副本,以便引用指向不同的对象。

    【讨论】:

    • 补充一点:在 Python 中,everything 被存储为对实际对象的引用。您应该始终将任何类型的赋值视为对某个对象的引用(“任何类型的赋值”包括将事物放入容器中)。如果您将任何其他类型的对象多次放入列表(或放入多个列表等),您可能会遇到类似的问题。甚至不可变的内置原始对象(包括数字、字符串和元组)也不例外;它们只是不可变的,所以如果你忘记了这条规则,你就不会对它们造成太大的麻烦。
    【解决方案2】:

    您观察到的是 Python 中的正常和预期行为,任何体面的教程都应该涵盖它。

    c.append(b)
    c.append(b)
    c.append(b)
    

    这将附加到c 对列表b 的三个引用。由于它是同一个列表,因此更改一个引用会在它引用的所有四个位置更改它,顺便说一下,包括b

    如果您不希望这种行为,请复制该列表。

    c.append(b[:])
    c.append(b[:])
    c.append(b[:])
    

    【讨论】:

    • 与字典相同的事情 ;-) 在这种情况下使用 dict.copy()
    • 所有可变对象也是如此
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多