摘要: 我通过获取原始列表的一部分创建了一个新的列表变量。当我调整新列表时,上一个列表也会更改,但是我可以确定它们是两个不同的列表!这是我的一般方法:
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?!
初始列表也应该更改。我已经用更简单的示例进行了测试,并获得了相同的结果。也许这是我之前的先前代码的结果? (如果需要,可以提供更多详细信息。)
谢谢!
答案 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:])