• Python的浅拷贝和深拷贝


    一、浅拷贝和深拷贝的理解

    浅拷贝:新开辟一块内存,只拷贝原数据的首地址,通过原数据的首地址去获取内容。(类似于建立快捷方式)

    深拷贝:新开辟一块内存,将被拷贝内容全部拷贝过来(直接独立复制)

    二、浅拷贝

    理解:重新分配一块内存,建立新的对象,里面的元素是原对象元素的引用

    list1==list2?True(元素的值一样)

    list1 is list2? False(内存不一样)

    1、浅拷贝的三种方法

    (1)使用数据类型本身的构造器(list、set、dict)

    1. #列表list
    2. list1=[1,2,3]
    3. list2=list(list1)
    4. #set
    5. set1=([1,2,3])
    6. set2=set(set1)
    7. #字典dict
    8. dict1={1:[1,'w'],2:33}
    9. dict2=dict(dict1)

    (2)切片--可变序列(如列表)用切片操作符

    1. list1=[1,2,3]
    2. list2=list1[:]

    注:

    ① 对于不可变数据类型(元组、字符串):

    • 元组 使用 tuple()和切片操作符: 
    • 字符串 使用 str()和切片操作符: 
    • 都不是浅拷贝,没有开辟新内存来存储原对象对子对象的引用

    列表的切片是浅拷贝(创建新的内存空间),元组的切片是赋值(不会创建新的内存空间)

    ② 切片操作符不能用于字典和集合完成浅拷贝

    (3).copy()函数 或者 copy.copy()

    !!copy.copy()要先导入copy模块

    1. list1=[1,2,3]
    2. list2=list1.copy()
    1. import copy#需要先导入copy模块
    2. list1=[1,2,3]
    3. list2=copy.copy(list1)

    2、浅拷贝的原对象的数据改变

    子变 父不变

    • 即 A=copy.copy(B) B的子对象变了,A变;B的父对象变了,A不变
    1. list1=[(1,2),3,[4,5]]
    2. list2=list1.copy()
    3. list1.append(31)
    4. print(list1)#[(1, 2), 3, [4, 5], 31]
    5. print(list2)#[(1, 2), 3, [4, 5]]
    6. list1=[(1,2),3,[4,5]]
    7. list2=list1.copy()
    8. list2.append(31)
    9. print(list1)#[(1, 2), 3, [4, 5]]
    10. print(list2)#[(1, 2), 3, [4, 5], 31]
    11. list1=[(1,2),3,[4,5]]
    12. list2=list1.copy()
    13. list1[0]+=(31,31)
    14. print(list1)#[(1, 2,31,31), 3, [4, 5]]
    15. print(list2)#[(1, 2), 3, [4, 5]]
    16. list1=[(1,2),3,[4,5]]
    17. list2=list1.copy()
    18. list1[2]+=[31,31]
    19. print(list1)#[(1, 2), 3, [4, 5,31,31]]
    20. print(list2)#[(1, 2), 3, [4, 5,31,31]]

    三、深拷贝.deepcopy() 或 copy.deepcopy()

    深拷贝后是两份独立的数据,改变任一数据不影响另一个

    1. import copy
    2. list1=[[1,2],(1,2),1]
    3. list2=copy.deepcopy(list1)
    4. print(list2)#[[1, 2], (1, 2), 1]
    5. list1.append('hhh')
    6. print(list1)#[[1, 2], (1, 2), 1, 'hhh']
    7. print(list2)#[[1, 2], (1, 2), 1]
    8. list1=[[1,2],(1,2),1]
    9. list2=copy.deepcopy(list1)
    10. list1[0].append('hhh')
    11. print(list1)#[[1, 2, 'hhh'], (1, 2), 1]
    12. print(list2)#[[1, 2], (1, 2), 1]
    13. list1=[[1,2],(1,2),1]
    14. list2=copy.deepcopy(list1)
    15. list1[1] += (111,222)
    16. print(list1)#[[1, 2], (1, 2,111,222), 1]
    17. print(list2)#[[1, 2], (1, 2), 1]

  • 相关阅读:
    华为OD机试真题- 关联子串-2023年OD统一考试(B卷)
    MySQL数据库基础 06
    Android malloc_debug实现原理及使用
    Cargo 使用教程
    已完成的python项目-环境离线部署
    网络安全(黑客)-自学手册
    python-opencv 培训课程笔记(1)
    kafka中topic的创建和查询
    MyBatis foreach标签有什么作用呢?
    05 【函数(上)】
  • 原文地址:https://blog.csdn.net/Echo_165/article/details/126615092