【问题标题】:Strange behaviour when changing value of list in a list更改列表中列表的值时的奇怪行为
【发布时间】:2015-05-19 23:16:40
【问题描述】:

在编写 Python 项目时,我注意到在尝试更改另一个列表中的列表值时出现了一种奇怪的行为。

无效的代码:

lst = []
to_add = [None,None,None]

for i in range(3):
    lst.append(to_add)

for i in range(3):
    lst[i][0] = anotherslistoflists[i][0]

令我惊讶的是,这个例子给出了意想不到的结果。具体来说,每个 lst[i][0] 都被分配了相同的值,该值是“anotherlistoflists”列表的最后一个索引中的第一个元素。

结果示例(打印 lst 时)

("word1",None,None)
("word1",None,None)
("word1",None,None)

工作代码:

lst = []

for i in range(5):
    lst.append([None,None,None])

# same code as above

结果示例2(预期结果)

("word1",None,None)
("word2",None,None)
("word3",None,None)

当然,您可以看到问题已解决,但我想知道为什么第一个代码不起作用。 “to_add”列表可能有问题,但我不明白这里有什么问题。

【问题讨论】:

    标签: python list


    【解决方案1】:

    您正在追加 同一个列表to_add,三次。然后,一旦你修改它,指向它的所有三个项目都将反映相同的变化。如果要创建具有相同值的新副本,可以使用内置的list 函数:

    for i in range(3):
        lst.append(list(to_add))
    

    【讨论】:

    • 好的,通过执行 list(to_add) 我正在创建一个新的 to_add 列表的独立实例。我现在明白了。谢谢!
    【解决方案2】:

    您正在添加相同的列表,to_addlst

    >>> a = [None]
    >>> b = [a]
    >>> c = [a]
    >>> print a, b, c
    [None] [[None]] [[None]]
    >>> a[0] = 1
    >>> print a, b, c
    [1] [[1]] [[1]]
    

    【讨论】:

      【解决方案3】:

      在第一种情况下,您没有添加add_to_list 的副本,实际上是在一遍又一遍地添加该确切列表,因此当您稍后更改它时,您将更改真正的add_to_list 以及引用它的任何地方。在第二种情况下,您每次都添加一个包含None 的新列表,并且每次都修改不同的列表

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2013-01-06
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        相关资源
        最近更新 更多