通过分割旧列表创建新列表;修改“新”也修改“旧”?

时间:2018-09-04 14:57:37

标签: python python-3.x list

摘要: 我通过获取原始列表的一部分创建了一个新的列表变量。当我调整新列表时,上一个列表也会更改,但是我可以确定它们是两个不同的列表!这是我的一般方法:

1。通过调用函数创建初始列表all_info。每个列表项本身就是一个包含5个元素的列表。

all_info = CrossReference(start_info, RBS_info, promoter_info)

2。通过切片初始列表以删除第一项来创建新列表all_info_mod(我需要在以后的代码中执行此操作)。然后确认它们是不同的。

all_info_mod = all_info[1:]

all_info #Shows original list
all_info_mod #Shows sliced list

3。将每个外部列表的前3个元素加1。然后检查。

for i in all_info_mod:
    for j in range(0, 3):
        i[j] += 1

all_info_mod #Successfully altered
all_info #Also altered?!

初始列表也应该更改。我已经用更简单的示例进行了测试,并获得了相同的结果。也许这是我之前的先前代码的结果? (如果需要,可以提供更多详细信息。)

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您不想在原始列表中进行更改,则应导入copy模块,并进行deepcopy

import copy

all_info_mod = copy.deepcopy(all_info[1:])

答案 1 :(得分:1)

之所以发生这种情况,是因为您要修改两个列表都包含对其的引用的可变对象。修改切片的列表不会更改切片,但是修改该列表中的可变对象也将在另一个列表中可见,因为两个列表都包含相同的对象。

list_ = [[1, 2, 3], [4, 5, 6]]
slice_ = list_[:]
list_[0] = [7, 8, 9]
print(slice_)
# [[1, 2, 3], [4, 5, 6]]

list_[1].append(0)
print(slice_[1])
# [4, 5, 6, 0]

print(list_[1] is slice_[1])  # The two lists both contain the same list object
# True

答案 2 :(得分:1)

执行此操作时:

all_info = [[1,2,3], [2,3,4], [5,6,7]]
all_info_mod = all_info[1:]

您对all_info执行切片以创建新列表all_info_mod。 问题在于all_info的元素是列表的(引用),因此all_info_mod将包含对列表的引用的副本。引用被复制,因此最后两个列表都包含对相同列表的引用。
这解释了为什么在修改all_info_mod元素引用的列表时,还要修改all_info元素引用的列表。

请注意,如果您通过赋值直接修改all_info_mod的元素,即用另一个列表替换对列表的引用,则all_info不会更改:

all_info_mod[1] = [9,9,9]
print(all_info)      # [[1, 2, 3], [2, 3, 4], [5, 6, 7]]
print(all_info_mod)  # [[2, 3, 4], [9, 9, 9]]

如果您确实要复制另一个列表中的数据,则必须使用方法copy.deepcopy(),如下所示:

import copy
all_info = ...
all_info_mod = copy.deepcopy(all_info[1:])