当前位置: 首页 > article >正文

[Python]之深拷贝与浅拷贝

Python之深拷贝与浅拷贝

概述:

​ 大白话解释就是 深拷贝拷贝的多, 浅拷贝拷贝的少.

  1. 深浅拷贝区别就是: 拷贝的层级的多与少.

  2. 深浅拷贝都能操作可变类型 和 不可变类型, 但是深浅拷贝一般操作的都是 可变类型, 几乎不会出操作不可变类型的.

  3. 可变类型 和 不可变类型的划分依据: 在不改变地址值的情况下, 元素值是否可以发生改变,

    可以: 可变类型, 不可以: 不可变类型.
    ​ 可变类型: 列表, 字典, 集合
    ​ 不可变类型: 整型, 浮点型, 字符串, 布尔型, 元组

  4. 深浅拷贝指的是 copy模块下的不同的函数.
    ​ 浅拷贝: copy.copy()
    ​ 深拷贝: copy.deepcopy()

因为深浅拷贝主要针对的是可变类型,不可变类型拷贝还是同一个地址,所以下面通过一个简单的方式讲明白深浅拷贝的区别
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = c
print(id(c))
print(id(d))

​ 当上面的代码执行后,我们发现c和d的地址是一样的,因为在python中 = 传递的是地址值,又因为python中list为可变类型,更改值并不会变更地址,所以,更改c的值的时候d的值也会被更改,那么如果我们想更改c而不更改d的时候怎么办呢?

这个时候就需要浅拷贝了
import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.copy(c)
print(id(c))
print(id(d))

​ 此时我们发现,d和c的地址值不一样了,浅拷贝将一个新的地址值给了d并将c的内容加进去了

​ 这个时候我们修改c,d里面除了a,b列表以外的值都不会有关联,但是,因为是浅拷贝,c d 里面复制的是ab的地址,这个时候修改c或d里面a,b的值,都会影响到另一个,可能会看不懂,这里代码试一下就明白了:

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.copy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)

运行结果如下:

在这里插入图片描述

这时聪明的小伙伴就理解了,深拷贝是将拷贝对象内部的地址内的内容也拷贝到新的地址

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, a, b]
d = copy.deepcopy(c)
print(id(c))
print(id(d))
print(c)
print(d)
print('-'* 30)
c[2] = 10
print(c)
print(d)
print('-'* 30)
c[3][0] = 5201314
print(c)
print(d)

这个时候修改c内a的值就不会影响到d了

在这里插入图片描述


http://www.kler.cn/a/287257.html

相关文章:

  • 如何将几个音频合成一个音频?非常简单的几种合成方法
  • 为何数据库推荐将IPv4地址存储为32位整数而非字符串?
  • ChatGPT学术专用版,一键润色纠错+中英互译+批量翻译PDF
  • MyBatis-Plus中使用JSON 类型字段
  • 游戏引擎学习第12天
  • 3. langgraph中的react agent使用 (在react agent添加系统提示)
  • Flask之Hello world 详解
  • 【补-办公室】拟批语的区别
  • 重构贪心算法(二)
  • 12大常用自动化测试工具,请记得转发收藏!
  • Leetcode 3277. Maximum XOR Score Subarray Queries
  • PostgreSQL LIMIT 子句的使用与优化
  • Jenkins版本升级
  • 米家“智能中枢网关”和“智能多模网关”有什么区别?
  • 快速回顾-HTML5
  • 前端宝典二十一:前端异步编程规范手写Promise、async、await
  • 01.项目初始化
  • 解决yum不能正常使用,报错: No module named yum,如何安装python2和python3并行版本,搭建自动化环境
  • 【Python机器学习】NLP词中的数学——向量化
  • 驭势科技研究成果入选学术顶会IROS 2024
  • LuaJit分析(十)luajit自定义修改
  • 如何使用GPT画出带中文的图和表?-已解决GPT画图表出现乱码的问题
  • 优先级队列面试题详解
  • link标签的用途
  • 微软 Maia 100 酷炫登场,强势叫板英伟达!
  • 找出成员满足条件的整个分组