【Python】python中的深浅拷贝
1.深浅拷贝(⚠️重要)
1.1 浅拷贝
1.1.1 定义
只拷贝第一层的内存地址
1.1.2 浅拷贝示例
赋值 示意浅拷贝前先说明赋值
- 赋值共用同一块内存空间,一个变量的值改变,另一个赋值的变量同时也改变
- 多个变量名指向同一块内存空间
3. # 列表示例4. lst = [1,1,3]
5. lst1 = lst
6. lst1.append(4) //正常思维理解应该是lst1更改后,lst不会改变,但是赋值是多个变量名指向同一个内存 空间,因此只要一个变量改变,另一个变量也改变
7. print (lst,lst1)
8. [1, 1, 3, 4] [1, 1, 3, 4]
11. # 字典示例
12. dic = {'k1':1,'k1':1}
13. dic1 = dic
14. dic1.update({'k1':111})
15. print (dic,dic1)
16. {'k1': 1, 'k1': 111} {'k1': 1, 'k1': 111}
赋值示意图
浅拷贝 只拷贝第一层的内存地址
1. # 列表中浅拷贝有两种方式2. lst = [1,1,3]
3. new_lst = lst.copy()
6. lst = [1,1,3]
7. new_lst = lst[:]
浅拷贝只拷贝第一层的内存空间地址,浅拷贝的两个变量是单独的内存空间,不再是共用同一个内存空间地址
3. #列表示例1 列表中未嵌套第二层元素4. lst = [1,1,3]
5. new_lst = lst.copy()
6. new_lst.append(4)
7. print (lst,new_lst)
8. [1, 1, 3] [1, 1, 3, 4]
9. # 浅拷贝中lst和new_lst结果不同
12. print (id(lst),id(new_lst))
13. 140584614767176 140584614774344
14. # 浅拷贝中lst和new_lst内存空间地址不同
17. # 列表示例1 列表中嵌套了第二层元素
18. lst = [1,1,[3,4,5]]
19. new_lst = lst.copy()
20. new_lst.append(6)
21. print (lst,new_lst)
22. [1, 1, [3, 4, 5]] [1, 1, [3, 4, 5], 6]
25. print (id(lst),id(new_lst))
26. 140431875130951 140431874963911
29. print (id(lst[1]),id(new_lst[1]))
30. # 浅拷贝只拷贝第一层内存空间,因此两个列表的第二个嵌套的元素的值内存空间相同
31. 140633470413384 140633470413384
浅拷贝单层元素示意图(增加元素)
浅拷贝多层元素示意图(修改元素)
浅拷贝多层元素示意图(第二层增加元素)
1.1.3 浅拷贝总结
1.浅拷贝只复制第一层内存空间地址
1.浅拷贝,修改第一层元素或者追加元素,都是将旧指向改变为新指向,两个变量互不影响
3.浅拷贝修改第二层及以下元素或者追加元素,修改的是两个变量共用的值,此时修改会影响两个变量
1.1.4 浅拷贝坑
1. lst = [1,3,[4,5],6]2. lst1 = lst
3. lst1 = lst[:]
4. lst1[-1] = [8,9]
5. lst1[-1].append([0]) #数字无法进行追加操作
6. print (lst,lst1,lst1)
7. AttributeError: 'int' object has no attribute 'append'
1.2深拷贝
1.2.1 定义
不可变数据类型共用内存空间,可变数据类型开辟新的内存空间,不管嵌套多少层都是这样的原理
1.2.2 深拷贝语法
1.2.3 深拷贝示例
1. import copy2. lst = [1,1,[3,4]]
3. new_lst = copy.deepcopy(lst)
4. print (id(lst[0]),id(new_lst[0])) #lst[0]为1,1是整型,是不可变数据类型 --> 共用内存空间地址
5. 4464777164 4464777164
8. print (id(lst[-1]),id(new_lst[-1]))
9. 140663166316984 140663166494088 #lst[-1]为[3,4],[3,4]是列表,是可变数据类型 --> 新开辟内存空间地址
1.2.4 深拷贝原理图
1.2.5 深拷贝总结
深拷贝中,不可变数据类型共用内存空间地址,可变数据类型开辟新的内存空间,不管嵌套多少层都是这样
以上是 【Python】python中的深浅拷贝 的全部内容, 来源链接: utcz.com/a/89345.html