码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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]

  • 相关阅读:
    力扣刷题-链表-两两交换链表中的节点
    MATLAB算法实战应用案例精讲-【工具篇】运筹优化工具OR-TOOLS(补充篇)(附实战案例及代码实现)
    微信H5页面点击直接跳转app-微信开放标签
    【Spring--SSM框架详解】主流Java后端开发,Mybatis+Spring+SpringMVC整合(更新Spring中)
    什么影响香港服务器的速度原因
    log4j升级到log4j2 spring
    如何通过优化 Python 中的 GPU 使用率将视频处理速度提高 5 倍(教程含源码)
    数据结构——线性表的顺序表示和实现
    Vue实现角色权限动态路由详细教程,在vue-admin-template基础上修改,附免费完整项目代码
    VM501开发套件开发版单振弦式传感器采集模块岩土工程监测
  • 原文地址:https://blog.csdn.net/Echo_165/article/details/126615092
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号