如何理解深浅拷贝和赋值的区别?

拷贝分为:

赋值,浅拷贝,深拷贝,拷贝程度一次递增

    赋值:

        赋值就是相当于做了个软连接,所以不管你是修改了链接文联的内容还是源文件的内容,这个文件都会有所改变(相当于镜子里的自己).

    浅拷贝:

        只是做了部分的拷贝,何谓部分拷贝?就是在赋值的基础上减去了列表最外层的链接,其他的和赋值基本一样,下面例子会有说明.

    深拷贝:

        相当于把文件复制了一份,新文件或老文件的改变都是互不相干的,完全独立于老文件.


1.先从id来分析:

import copy
a = [1,2,3,[4,5,6,[7,8,9]]]

b = a
c = copy.copy(a)
d = copy.deepcopy(a)

print('查看每个变量的id')
print(id(a))
print(id(b))
print(id(c))
print(id(d))

image.png

扫描二维码关注公众号,回复: 2637468 查看本文章

有上面的结果可以得出,赋值的id是和原来的id是一样的,赋值只是把指针指向了列表a

深拷贝和浅拷贝的id是不一样的,由此看出,深浅拷贝是分别独立开辟出了一个内存空间了


2.在列表中增加元素来看看效果:

①赋值和原列表的比较

import copy
a = [1,2,3,[4,5,6,[7,8,9]]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)

print('这个是最初的列表')
a.append('aaa')
a[3].append('aaa')
a[3][3].append('aaa')
print('原列表a',a)

print('这个是赋值')
b.append('bbb')
b[3].append('bbb')
b[3][3].append('bbb')
print('原列表a',a)
print('赋值列表b',b)

image.png

所以赋值列表,无论是原列表增加还是赋值列表增加都会增加

②.浅拷贝和原列表的比较:

import copy
a = [1,2,3,[4,5,6,[7,8,9]]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)

print('这个是最初的列表')
a.append('aaa')
a[3].append('aaa')
a[3][3].append('aaa')
print('原列表a',a)

print('这个是浅拷贝')
c.append('ccc')
c[3].append('ccc')
c[3][3].append('ccc')
print('原列表a',a)
print('浅拷贝列表c',c)

image.png

由此可得出的结论是浅拷贝和原列表深层元素相当于赋值,最外层元素,相当于深拷贝,浅拷贝是赋值和深拷贝的中间产物


③.深拷贝和原列表的比较:

image.png

有上面的例子得出,深拷贝和浅拷贝是互不相关的,各自都对对方没有影响!


猜你喜欢

转载自blog.51cto.com/853056088/2156686