python中深拷贝和浅拷贝

# copy.copy 和copy.deepcopy都需要引用copy模块

1 import copy
2 # 对于不可变类型(数值,元组,字符串),浅拷贝和深拷贝一样,内存地址都是一样的
3 a = 2
4 a2 = copy.copy(a)
5 a3 = copy.deepcopy(a)
6 print('a的内存地址是%s: '% id(a))
7 print('a2的内存地址是%s: '% id(a2))
8 print('a3的内存地址是%s: '% id(a3))
1 C:ProgramDataAnaconda3python.exe E:/cnz/day2/深拷贝浅拷贝.py
2 a的内存地址是8791395856160: 
3 a2的内存地址是8791395856160: 
4 a3的内存地址是8791395856160: 

# 对于可变类型(列表,字典),分两种情况

 1 # 列表或者字典没有嵌套的情况下,浅拷贝和深拷贝内存地址与原对象都是不一样的,改变浅拷贝的值,不会影响原来的值
 2 li = [1,2,3]
 3 li2 = copy.copy(li)
 4 li3 = copy.deepcopy(li)
 5 print('li 的内存地址是%s: ' % id(li))
 6 print('li2 的内存地址是%s: ' % id(li2))
 7 print('li3 的内存地址是%s: ' % id(li3))
 8 
 9 # 改变li2的值
10 li2[0] = 4
11 print(li)
12 print(li2)
13 print(li3)
1 li 的内存地址是43566728: 
2 li2 的内存地址是43565704: 
3 li3 的内存地址是43634632: 
4 [1, 2, 3]
5 [4, 2, 3]
6 [1, 2, 3]
 1 # 列表中嵌套列表的情况,如果改变外层列表,浅拷贝的值不会变,如果改变原内层列表的值,浅拷贝的内层列表值也会改变,以为内层列表的内存地址是一样的
 2 
 3 l = [1,2,[1,2]]
 4 l2 = copy.copy(l)
 5 l3 =copy.deepcopy(l)
 6 print('l的内存地址是%s: '% id(l))
 7 print('l2的内存地址是%s: '% id(l2))
 8 print('l3的内存地址是%s: '% id(l3))
 9 l[2][0] = 3
10 print('l是%s' % l)
11 print('l2是%s' % l2)
12 print('l3是%s' % l3)
1 l的内存地址是43634504: 
2 l2的内存地址是43634568: 
3 l3的内存地址是43610184: 
4 l是[1, 2, [3, 2]]
5 l2是[1, 2, [3, 2]]
6 l3是[1, 2, [1, 2]]
原文地址:https://www.cnblogs.com/hujc/p/11919800.html