关于列表的学习:
python删除列表中重复元素_笨小古的博客-CSDN博客_python删除列表重复数据
1.非复制方法——直接赋值
如果用赋值运算符"="直接赋值例如 a=b,则是一种非复制方法,此时 a 和 b 两个列表是等价的,修改其中任何一个列表都会影响另一个列表。
a = [1, 2, 3]
b = a
print(a)
print(b)
a[0] = 4
print(a)
print(b)
b[1] = 5
print(a)
print(b)
输出:
可以看出,在执行 b=a 后,a 和 b相当于C/C++中的指针,它们指向相同的空间,此后会同步改变,这种方法没有实现列表的真复制。
2.列表的深复制
列表之间的深复制是通过调用copy模块的deepcopy()实现的,例如 b= copy.deepcopy(a),则无论a有多少层,得到的新列表b都是和原来无关的,这是最安全、最有效的赋值方法。
import copy
a = [1, [1, 2, 3], 4]
b = copy.deepcopy(a)
print(a)
print(b)
b[0] = 3
b[1][0] = 3
a[0] = 9
print(a)
print(b)
输出:
3.列表的浅复制
可以使用列表的copy()方法实现列表的浅复制。
a = [1, [1, 2, 3], 4]
b = a.copy()
print(a)
print(b)
b[0] = 3
b[1][0] = 3
print(a)
print(b)
输出:
从输出结果可以看到,对于a的第一层是实现了深复制,但对于嵌套的列表仍然是浅复制。内层的列表保存的是地址,在复制过去的时候是把地址复制过去了。实际上使用列表推导产生新列表也是一个浅复制方法,只对第一层实现深复制,例如以下程序和上述浅复制的结果是相同的:
a = [1, [1, 2, 3], 4]
b = [i for i in a]
print(a)
print(b)
b[0] = 3
b[1][0] = 3
print(a)
print(b)