繁体   English   中英

Python:列表中相同的项目被视为相同

[英]Python: identical items in list are treated as the same

我在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 [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]

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

您很可能不会复制目标列表(* [duplicate_me] *),而只是将对同一列表的重复引用附加到myList中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM