【问题标题】:Python: identical items in list are treated as the samePython:列表中的相同项目被视为相同
【发布时间】:2013-04-06 18:38:06
【问题描述】:

我在 python 中有一个嵌套列表。第二个列表的每个项目也是一个嵌套列表。我的目标是复制一个列表,将其插入同一索引,然后修改每个列表。所以,开始条件的例子:

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me]]]

在 myList[1][2] 处复制/插入:

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me], [duplicate_me]]]

这一切都很好。但是,当我运行附加代码时:

 myList[1][2].append(new_element)

它将新元素附加到两个副本,如下所示:

 myList = [[first_list], [[element_1], [element_2, element_3], [duplicate_me, new_element], [duplicate_me, new_element]]]

元素被调用或索引的方式有什么奇怪的吗?我看到了一个潜在的解决方法(调用要复制的项目到一个工作变量,在那里修改它,然后在同一点插入它),但这似乎不必要地复杂。

谢谢!

【问题讨论】:

  • 问题在于你如何创建myList(或者至少是那个子列表)。请专注于这一点,这样我们就知道这是哪个问题的重复;-)

标签: python list insert indexing append


【解决方案1】:

您很可能没有复制目标列表 (*[duplicate_me]*),而是简单地将同一列表的重复 reference 附加到 myList 中。 p>

您需要先复制列表,然后再将其添加到 myList。一种简单的方法是调用列表构造函数传入原始 [duplicate_me]

【讨论】:

    【解决方案2】:

    myList[1][2] 和 myList[1][3] 不仅具有相同的值,它们实际上是相同的列表。当您阅读它们时,您正在查看内存中的同一区域。所以,当你改变一个时,你就是在改变另一个,因为两者实际上是完全一样的!相反,您应该复制列表。

    这是一个来自 python shell 的问题示例:

    >>> mylist = [1, 2, 3]
    >>> newlist = mylist
    >>> newlist.append(4)
    >>> newlist
    [1, 2, 3, 4]
    >>> mylist
    [1, 2, 3, 4]
    

    解决此问题的常用方法是使用以下技巧之一:

    >>> mylist = [1, 2, 3]
    >>> newlist = mylist[:]  # OR :
    >>> newlist = [x for x in mylist]
    >>> newlist.append(4)
    >>> newlist
    [1, 2, 3, 4]
    >>> mylist
    [1, 2, 3]
    

    第二行和第三行将创建列表的副本。如果我需要复制 2D 列表,我倾向于像这样将两者结合起来:

    >>> newlist = [x[:] for x in mylist]
    

    使用其中一个来创建您的副本,一切都会再次好起来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多