For循环删除项影响了错误的列表-Python
我需要创建一个包含ID和一个不包含ID的日期列表。for循环在没有\u id的情况下作用于For循环删除项影响了错误的列表-Python,python,python-2.7,Python,Python 2.7,我需要创建一个包含ID和一个不包含ID的日期列表。for循环在没有\u id的情况下作用于,那么为什么这两个使用\u id打印语句会产生不同的结果(缺少第1列) 输出: [[u'ID 1', datetime.datetime(2014, 12, 9, 0, 0), datetime.datetime(2015, 2, 17, 0, 0), datetime.datetime(2015, 3, 4, 0, 0), datetime.datetime(2015, 3, 13, 0, 0)], [u
,那么为什么这两个使用\u id打印语句会产生不同的结果(缺少第1列)
输出:
[[u'ID 1', datetime.datetime(2014, 12, 9, 0, 0), datetime.datetime(2015, 2, 17, 0, 0), datetime.datetime(2015, 3, 4, 0, 0), datetime.datetime(2015, 3, 13, 0, 0)], [u'ID 2', datetime.datetime(2014, 12, 9, 0, 0), datetime.datetime(2015, 2, 17, 0, 0), datetime.datetime(2015, 3, 4, 0, 0), datetime.datetime(2015, 3, 13, 0, 0)]]
[[datetime.datetime(2014, 12, 9, 0, 0), datetime.datetime(2015, 2, 17, 0, 0), datetime.datetime(2015, 3, 4, 0, 0), datetime.datetime(2015, 3, 13, 0, 0)], [datetime.datetime(2014, 12, 9, 0, 0), datetime.datetime(2015, 2, 17, 0, 0), datetime.datetime(2015, 3, 4, 0, 0), datetime.datetime(2015, 3, 13, 0, 0)]]
由于带有\u id的引用列表,因此没有\u id的将不会引用同一列表。因此,当您从没有\u id的中删除项目时,您正在从基础列表对象中删除项目,该对象与具有\u id的仍在引用的列表相同。因此,对于引用同一对象的所有变量,将显示对同一对象的所有更改
您必须创建列表的副本,而不是复制引用。通常,您会这样做:
without_ids = with_ids[:]
但是,这只会复制外部列表,使其成为浅层副本。因为您的列表包含列表列表,所以您需要一个深度副本。在这一点上,它变得有点乏味
因此,您可以创建一个新列表,而不是创建副本,该列表只包含要保留的元素:
这是一个列表理解,它将使用_id
迭代中的所有元素,只需选择除第一个元素之外的所有子列表元素(elem[1://code>表示从第一个索引开始,然后获取所有内容),并从这些元素中创建一个新列表。在语句中
without_ids = with_ids
您正在使不带\u id的引用与带\u id的相同的对象(这称为别名)
你能做什么?你可以制作一个(一个带有_id[:]
的简单副本不起作用,因为它是一个嵌套列表):
without_ids = with_ids[:]
without_ids = [elem[1:] for elem in with_ids]
without_ids = with_ids
import copy
without_ids = copy.deepcopy(with_ids)