列表的复制
在之前的实训中,我们做过列表复制相关的练习,在题目中,我们的要求是使用 for 循环实现列表复制,可能有同学就会发现,为什么不直接新建一个变量,将原列表赋值给这个变量呢?如下面代码所示:
list1 = [1,2,3,4]
list2 = list1
print(list1)
print(list2)
执行结果:
[1,2,3,4]
[1,2,3,4]
从执行结果来看,确实是实现了列表的复制功能,但是实际上并没有实现列表的复制,如果对 list2 进行增删改操作时,list1也会发生相应的变化。
list1 = [1,2,3,4]
list2 = list1
list2.append(5)
print(list1)
print(list2)
执行结果:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
浅拷贝//只保证了外层可以被改变,内层还是无法做到不一致
想要了解什么是浅拷贝,我们首先就需要列表嵌套的相关知识。在前面的实训中,我们可以了解到列表是可以嵌套的,列表内的元素还可以是列表。
list1 = [1,[2,3],4,5] # list1列表中的第二个元素也是一个列表,这就是一个嵌套列表
浅拷贝是复制列表的最外层,内存的嵌套的列表并不会复制。浅拷贝需要使用 copy 模块中的 copy 函数。
import copy
list1 = [1,[2,3],4,5]
list2 = copy.copy(list1) # 使用浅拷贝复制一个列表
list2.append(6) # list2末尾添加一个元素6
list2[1].append(6) # list2第二个元素的列表的末尾添加一个6
print(list1)
print(list2)
执行结果:
[1, [2, 3, 6], 4, 5]
[1, [2, 3, 6], 4, 5, 6]
从执行结果可以得知,两个列表的元素不一样了,但是列表中的嵌套列表还是一致的,浅拷贝只能拷贝表层,嵌套在列表内的列表并没有拷贝。
深拷贝
如果要彻底地产生一个完全独立的复制品,就需要使用深拷贝。深拷贝需要使用到 copy 模块中的 deepcopy 函数。
import copy
list1 = [1,[2,3],4,5]
list2 = copy.deepcopy(list1) # 使用深拷贝复制一个列表
list2.append(6) # list2末尾添加一个元素6
list2[1].append(6) # list2第二个元素的列表的末尾添加一个6
print(list1)
print(list2)
执行结果:
[1, [2, 3], 4, 5]
[1, [2, 3, 6], 4, 5, 6]
留下列表中非重复元祖
########## Begin ##########
第1步:使用 input 函数获取列表
import copy
list1 = eval(input())
第2步:去除列表内的非重复值,打印处理后的列表
list2 = copy.deepcopy(list1)
for x in range(len(list1)):
value = True
for y in range(len(list1)):
if x == y:
continue
if list1[x] == list1[y]:
value = False
break
if value:
list2.remove(list1[x])
print(list2)
########## End ##########