【Python基础】深拷贝,浅拷贝和赋值

2023-10-27

浅拷贝:在含有多层对象的字典,列表,集合中,浅拷贝只拷贝父对象,不会拷贝父对象内部的可变子对象。语法:copy.copy()

深拷贝:只要被拷贝对象含有可变子对象,程序就会重新申请一块内存空间把被拷贝对象的值复制一份存放到该内存空间中。语法:copy.deepcopy()

首先, 浅拷贝不是赋值,赋值与浅拷贝并不相等。赋值是在变量和值之间建立引用,并不是拷贝引用指向的数据,而浅拷贝就是拷贝引用指向的数据给另外一个引用。两者存在本质区别。

a = 1
b = a

c = 1
c = 2

上面的第一和第二语句说明变量a和变量b引用相等,即存储的值都是指向内存空间值为1的地址。第三句和第四句说明c重新建立了引用,由于一个变量只能引用一个值,所以c只会指向内存空间存储值为2的地址。

# 浅拷贝举例1
temp_var_one = [1, 2, "olivier"]
temp_var_two = copy.copy(temp_var_one)
# temp_var_two = temp_var_one               # 赋值和copy的区别:赋值是引用相等, copy是拷贝一份地址的值到另一个引用
print(id(temp_var_one), id(temp_var_two))   # 用赋值id相等, 用copy时id不等
temp_var_two[2] = "olivier_"
print(temp_var_one, temp_var_two)   # [1, 2, 'olivier'] [1, 2, 'olivier_']
# 浅拷贝举例2
temp_var_three = [1, 2, {1, 3, 2}]
temp_var_four = copy.copy(temp_var_three)
temp_var_four[2].add(4)
print(temp_var_three, temp_var_four)    # [1, 2, {1, 2, 3, 4}] [1, 2, {1, 2, 3, 4}]

        1)从赋值id相同,浅拷贝id不同的结果可以看出赋值只是创建相同的引用给新的变量,而浅拷贝是赋值内存空间中的数据给另外一个变量。

        2)当父级对象只含有不可变数据类型时,因为不可变数据类型被修改时会重新开辟内存地址并储存,所以修改浅拷贝的对象并不会影响到被拷贝的对象的值,如浅拷贝举例1。

        3)当父级对象含有可变数据类型时,因为浅拷贝只复制了可变数据类型对象的引用,并没有重新申请内存空间,所以修改浅拷贝对象的可变数据类型的值时,也会导致被拷贝的对象的可变数据类型的值一起变化。

# 深拷贝举例1
temp_var_one = [1, 2, "olivier"]
temp_var_two = copy.deepcopy(temp_var_one)
temp_var_two[2] = "olivier_"
print(temp_var_one, temp_var_two)   # [1, 2, 'olivier'] [1, 2, 'olivier_']
# 深拷贝举例2
temp_var_three = [1, 2, {1, 3, 2}]
temp_var_four = copy.deepcopy(temp_var_three)
temp_var_four[2].add(4)
print(temp_var_three, temp_var_four)    # [1, 2, {1, 2, 3}] [1, 2, {1, 2, 3, 4}]

        上图的深拷贝的例子,当进行深拷贝时,会针对被拷贝对象的所有可变数据类型进行真正的值拷贝到另一块内存空间当中,所有当拷贝对象发生变化时,不会影响被拷贝对象的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python基础】深拷贝,浅拷贝和赋值 的相关文章

随机推荐

  • 解决debug时断点自动进入到URLClassPath.class类中

    转发自 url http blog sina com cn s blog 447dca3d01015yqf html url 问题 在eclipse中debug某个类 结果断点每次都先跳到URLClassPath class中 但是在这个类
  • Error: Unable to find git in your PATH.

    周五打开as以及vs都可以正常编译项目 今天已编译就出这个Error Error Unable to find git in your PATH 最终在Github上找到答案 https github com flutter flutter
  • numpy中的mgrid函数

    mgrid函数返回多维结构 ret np mgrid 第1维 第2维 第3维 一维的表示是np mgrid 起点 终点 步长 二维的表示是np mgrid 起点 终点 步长 起点 终点 步长 当步长为实数时 表示按间隔来分 1表示从起点按0
  • RT-Thread记录(十八、I2C软件包 — 温湿度传感器 SHT21与EEPROM 24C02)

    本文学习测试一下几款典型设备的 RT Thread I2C软件包 目录 前言 一 RT Thread I2C 总线注册 1 1 I2C 设备使用步骤 1 2 检查问题 二 温湿度传感器软件包 2 1 添加及基本测试 2 2 程序中使用 三
  • Hive初始化报错:org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver

    Hive初始化报错 org apache hadoop hive metastore HiveMetaException Failed to load driver 完整错误如下所示 org apache hadoop hive metas
  • GAN网络的重新学习的一些内容记录

    20211130 本篇文章属于自己在学习过程中的一些内容记录 正是因为对这些内容不理解 才有了这篇文章 同时会记录一些自己的思考 对与错请仔细斟酌 0 引言 经过了一年多 上次专门研究GAN是去年的时候 学习了基础的原理 也记录了一些文章
  • 架构-负载均衡

    互联网常见的分布式加构分层 1 客户端层 浏览器 APP 小程序 等 2 反向代理层 Nginx 3 站点层 web server 4 服务层 service dubbo webservic 5 数据层 DB 这五个分层的负载均衡策略 1
  • typescript版本的扫雷游戏设计(思路+代码)

    思路 生成图片矩阵 点击格子 如果 第一次 且 新游戏 生成除该格子外的雷图 统计数字 如果 该格子是雷 爆炸 否则 如果 格子数字是0 深度搜索0区域 加入展示区域 如果格子已经打开 忽略 如果格子标识旁边有雷 把该格子加入展示区域 打开
  • 动画程序时长缩放是什么意思_修手机的朋友说:安卓机这样设置,感受跟苹果一样的过渡动画...

    众所周知 IOS系统的过渡动画是出了名的丝滑 因为就在安卓系统挤破脑袋追求流畅时 苹果工程师竟然反其道而行的降低了手机响应频率 这就导致iPhone的使用者在不同页面和软件切换时能明显感知到一个从慢到快的过程 这项功能在原厂的安卓系统上是没
  • 值得一看的技术类书籍

    1 linux 书 Debug Hacks中文版 深入调试的技术和工具
  • C语言开发MicroPython模块(向module添加type)

    MicroPython向module添加type的方法 以及向type添加function的方法都是按照定义好的固定框架进行添加 module添加type的代码格式如下 include stdint h include stdio h in
  • M2芯片安装Anaconda和pytorch

    记录安装过程中遇到的问题 希望帮助到同样用mac的朋友 1 安装好Anaconda后 在启动台无法打开navigator 解决办法 终端输入 which anaconda navigator 返回navigator所在位置 command
  • SpringCloud Stream @EnableBinding注解过时

    EnableBinding源码中明确声明 该注解在从3 1版本开始被弃用 推荐我们使用函数编程的方式 我将给出一个生产者和消费者的使用案例 生产者案例 yml配置 server port 8801 spring application na
  • 最最最详细的springboot项目中集成微信扫码登入功能.步骤代码超级详细(OAuth2)

    说到登录注册 就会想到先要注册一个用户名 在进行登入 但是现在大多数的网站都集成了微信登入 不需要注册 给你一个二维码 微信一扫直接登录 这确实是十分便捷的 所以我们会尽量在项目中实现这一功能 减少用户操作 提高用户产品体验 由于微信是腾讯
  • MIPS架构下linux软浮点研究

    转自 http blog sina com cn s blog 67b113a10100zxx3 html 在嵌入式领域 为了节省成本和减少功耗 很多芯片都是没有浮点运算模块的 一般该模块叫做FPU float process unit 这
  • 爬虫写得好,牢饭吃到饱?

    先说一条新闻 一家专注大数据的数据服务提供商公司巧达科技 因为大量使用爬虫访问其他公司接口获取数据 整个公司被抓 最后不光管理者 干活的程序员也被抓了 很多学python的同学都接触过爬虫 即便是没接触过应该也听过 看到这种新闻你会不会心里
  • MySQL管理常用工具介绍

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 e选项可以在Mysql客户端执行SQL语句 而不用连接到MySQL数据库再执行 对于一些批处理脚本 这种方式尤其方便 示例 2 mysqladmin mysql
  • 第一启富金:两大利空压顶 黄金受压收跌

    第一启富金官网显示 全球最大黄金上市交易基金 ETF 截至01月19日持仓量为976 21吨 较上日持平 本月止净增持0 55吨 香港第一金 投资者的注意力仍集中在美联储1月25日至26日的会议上 此前美联储官员暗示 他们将在3月开始加息以
  • Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)

    目录 一 概述 1 介绍 2 讲述 二 上传 三 下载 四 jrebel的使用 五 多文件上传 给我们带来什么收获 一 概述 1 介绍 Spring MVC的文件上传下载是指在Spring MVC框架中实现文件的上传和下载功能 文件上传是指
  • 【Python基础】深拷贝,浅拷贝和赋值

    浅拷贝 在含有多层对象的字典 列表 集合中 浅拷贝只拷贝父对象 不会拷贝父对象内部的可变子对象 语法 copy copy 深拷贝 只要被拷贝对象含有可变子对象 程序就会重新申请一块内存空间把被拷贝对象的值复制一份存放到该内存空间中 语法 c