python开发之路之深浅拷贝

Posted zhangjunchao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python开发之路之深浅拷贝相关的知识,希望对你有一定的参考价值。

深浅拷贝

技术分享图片

特别说明:
1. 浅拷贝只拷贝一层,后面就是共享了。
2. 例如[ [1,2,3] ,4,5,6 ],在这个嵌套列表中,小列表[1,2,3]就是一块共享的内存空间,它不是存储地址,所以你浅拷贝过来的数据对小列表即共享内存空间进行了数据修改,那么,之前的源数据也会被修改。因为修改了共 享内存空间的数据, 就相当于修改了源数据在内存中的指针方向。                           
3.深拷贝相当于克隆一份。

浅拷贝
实例一:
a = [1,‘alex‘,‘alvin‘]
b = a[:]
print(a)
print(b)
打印结果如下:

D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[1, ‘alex‘, ‘alvin‘]
[1, ‘alex‘, ‘alvin‘]
这个时候对b中的‘1‘进行修改,观察a列表里面的值是否会发生变化?
b[1] = ‘zhangjunchao‘ #修改1的值为zhangjunchao
print(a)
print(b)
D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[1, ‘alex‘, ‘alvin‘] #a没有发生变化
[1, ‘zhangjunchao‘, ‘alvin‘] #b发生变化


实例二:
a = [[1,2],‘alex‘,‘alvin‘]
b= a.copy()
print(a)
print(b)
打印结果如下:
D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[[1, 2], ‘alex‘, ‘alvin‘]
[[1, 2], ‘alex‘, ‘alvin‘]
这个时候对b中的‘1‘进行修改,观察a列表里面的值是否会发生变化?
b[0][0] = ‘zhangjunchao‘
print(a)
print(b)
打印结果如下:
D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[[‘zhangjunchao‘, 2], ‘alex‘, ‘alvin‘]
[[‘zhangjunchao‘, 2], ‘alex‘, ‘alvin‘]
说明:这个时候发现a和b中的嵌套列表的值都发生了变化。那么这是为什么呢,请分析浅拷贝的原理图。


深拷贝(deepcopy)
实例一:
import copy
a = [‘zhangjunchao‘,1000,[20000,9000]]
b = copy.deepcopy(a) #b进行一次深拷贝
print(a)
print(b)
D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[‘zhangjunchao‘, 1000, [20000, 9000]]
[‘zhangjunchao‘, 1000, [20000, 9000]] #拷贝过后发现值都一样
那么,这个时候如果对b小列表的数据进行修改,比较一下a和b这个时候列表的变化?
b[2][1] = 3000
print(a)
print(b)
打印结果如下:
D:\\python3.5\\python.exe D:/pycharm/data/第一周/day3/深浅拷贝.py
[‘zhangjunchao‘, 1000, [20000, 9000]]
[‘zhangjunchao‘, 1000, [20000, 3000]]
这个时候发现,b列表的的小列表的值发生了变化,而a没有,这就是深拷贝。也就是说深拷贝是全部拷贝,指针都是指向内存寻址空间的,不是共享空间,所以b修改了,不会影响a的指针指向。





























































以上是关于python开发之路之深浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路:基础知识之深浅拷贝

python之路13python的深浅拷贝

Python之路8-深浅拷贝

python之路---07 join() fromkeys() 深浅拷贝

python运维开发之路02

巨蟒python全栈开发-第7天 基本数据类型补充&深浅拷贝