python浅拷贝与深拷贝
1、直接引用
a = {1,[1,2,3]}
b =a
a 和 b 直接指向同一个对象
2、浅拷贝
使用模块 import copy
使用方法: copy.copy()
分为两种情况:
- 被拷贝对象是不可变类型(string、元组)
- 拷贝之后 与 原先值相同,且id值也不会改变
old_str="strings" new_str=copy.copy(old_str) print(id(old_str)) print(id(new_str))
>>1351147584752 >>1351147584752
- 被拷贝对象是可变类型
- 被拷贝对象只是单纯的list、set、dict对象
原来值的改变并不会影响浅复制的值
浅复制的值改变也并不会影响原来的值
原来值的id值与浅复制原来的值不同
-
- 被拷贝对象有可变类型的子对象 (如:[1,[2,3]])
原来的值改变(不改变[2,3]这个数组的前提下)不会影响拷贝的值
浅拷贝的值(不改变[2,3]这个数组的前提下)改变也并不会影响原来的值
原来的值改变(改变[2,3]这个数组)会影响拷贝的值
浅拷贝的值(改变[2,3]这个数组)改变会影响原来的值
a=[1,[2,3]] b=copy.copy(a)
#修改a[0]的值
a[0] = 4
print(a)
print(b)
>>[4,[2,3]] a的值改变
>>[1,[2,3]] b的值未改变
b[0] = 5
print(a)
print(b)
>>[4,[2,3]] a的值未改变
>>[5,[2,3]] b的值改变
a[1].append(33) b[1].append(22) print(a) print(b) >>[4, [2, 3, 33, 22]] #a的值被改变 >>[5, [2, 3, 33, 22]] # b的值也被改变
3、深拷贝
使用模块:import copy
使用方法: copy.deecopy()
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。
- 因此修改原来对象的值(包括子对象)都不会影响拷贝对象的值
importcopy a=[1,[2,3]] b=copy.deepcopy(a) a[0]=4 a[1].append(3333) b[1].append(5555) print(a) print(b) >>[4, [2, 3, 3333]] >>[1, [2, 3, 5555]]

浙公网安备 33010602011771号