码迷,mamicode.com
首页 > 编程语言 > 详细

python开发之路之深浅拷贝

时间:2017-12-26 17:50:00      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:arm   exe   pycha   [1]   空间   拷贝   也会   浅拷贝   嵌套   

深浅拷贝

技术分享图片

特别说明:
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开发之路之深浅拷贝

标签:arm   exe   pycha   [1]   空间   拷贝   也会   浅拷贝   嵌套   

原文地址:https://www.cnblogs.com/zhangjunchao/p/8118537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!