深浅拷贝
特别说明:
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的指针指向。