python3里面列表的拷贝知识点:
(1)单纯的赋值,如b = a; 可以记为“浅浅拷贝”,意思就是只要a改变,b就跟着改变。
(2)copy()方法,如b = copy.copy(a); 可以记为“深浅拷贝”,意思就是a中的父对象(一级目录)是深拷贝,子对象(非一级目录)是浅拷贝。
(3)deepcopy()方法,如b = copy.deepcopy(a); 可以记为“深深拷贝”,意思就是a中的所有对象都是深拷贝。
注:深拷贝就是拷贝过来的永远都是原先的列表,拷贝过来后的列表不管原先的列表再什么变,都不会关联到;
浅拷贝就是拷贝过来的列表会随着原列表的变化而变化。
如下示例代码演示:
import copy
a = [1, 2, [3, 4]]
b = a # 浅浅拷贝
c = copy.copy(a) # 深浅拷贝:父对象(一级目录,如1,2)是深拷贝,子对象(非一级目录,如3,4)为浅拷贝
d = copy.deepcopy(a) # 永为深拷贝
# 如下对a父对象做变动
a.append(5)
print("变动a父对象后的结果:")
print(a)
print(b)
print(c)
print(d)
# 对a子对象做变动:
a[2][0] = 5
print("变动a子对象后的结果:")
print(a)
print(b)
print(c)
print(d)
输出结果:
变动a父对象后的结果:
[1, 2, [3, 4], 5]
[1, 2, [3, 4], 5]
[1, 2, [3, 4]]
[1, 2, [3, 4]]
变动a子对象后的结果:
[1, 2, [5, 4], 5]
[1, 2, [5, 4], 5]
[1, 2, [5, 4]]
[1, 2, [3, 4]]
结论:
分析可得,copy()父对象改变,拷贝结果依然不变,子对象改变,拷贝结果中对应的子对象会跟着改变;
而deepcopy()父对象和子对象的改变不会关联到拷贝的结果。
通常我们口头所说的大多是“deepcopy”.
补充:
切片提取全部的方式也算是“深拷贝”!!!
走过的坑:
temp = input("请输入字符串参数:")
list1 = list(temp)
print("list1:", list1)
list2 = list1
print("list2:", list2)
list1.reverse()
list3 = list1
print("list3", list3)
if (list2 == list3):
print("是回文联")
print("真正的list2值:", list2)
print("真正的list3值:", list3)
else:
print("不是回文联")
结果:
解释:此处是判断一个回文联的例子,回文联:顺序和倒序一样,如:上海自来水来自海上
这个案例就充分展示了a=b为浅复制。