【Python】python中的深浅拷贝

1.深浅拷贝(⚠️重要)

1.1 浅拷贝

1.1.1 定义

只拷贝第一层的内存地址

1.1.2 浅拷贝示例

赋值 示意浅拷贝前先说明赋值

  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}

赋值示意图

【Python】python中的深浅拷贝

浅拷贝 只拷贝第一层的内存地址

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

浅拷贝单层元素示意图(增加元素)

【Python】python中的深浅拷贝

浅拷贝多层元素示意图(修改元素)

【Python】python中的深浅拷贝

浅拷贝多层元素示意图(第二层增加元素)

【Python】python中的深浅拷贝

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 copy

2. 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 深拷贝原理图

【Python】python中的深浅拷贝

1.2.5 深拷贝总结

深拷贝中,不可变数据类型共用内存空间地址,可变数据类型开辟新的内存空间,不管嵌套多少层都是这样

以上是 【Python】python中的深浅拷贝 的全部内容, 来源链接: utcz.com/a/89345.html

回到顶部