我在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]]]
元素调用或索引的方式是否有些奇怪的事情?我看到了一个潜在的解决方法(将项目复制到一个工作变量,在那里修改它,然后在同一点插入它),但这似乎是不必要的复杂。
谢谢!
答案 0 :(得分:3)
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]
使用其中一个来创建副本,一切都会好起来。
答案 1 :(得分:1)
您很可能不会复制目标列表(* [duplicate_me] *),而只是将重复的引用附加到 myList 的同一列表中。
您需要在将列表添加到myList之前复制该列表。一种简单的方法是调用列表构造函数传递原始[duplicate_me]