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]]

 






 

posted @ 2022-03-11 18:46  进击测开的小Cj  阅读(78)  评论(0)    收藏  举报