首页 > 其他分享 >25. 深浅拷贝

25. 深浅拷贝

时间:2024-10-30 18:20:17浏览次数:1  
标签:p2 25 p1 深浅 print 拷贝 copy id

一、什么是浅拷贝

  只对对象的最顶层进行的拷贝称为 浅拷贝。我们可以用 copy 模块中的 copy() 方法实现浅拷贝。

浅拷贝

import copy

a = [11, 22, 33]
b = [44, 55, 66]
c = [a, b]
d = copy.copy(c)

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

  当使用 copy.copy() 来完成浅拷贝的时候,它其实是需要检查以下拷贝的数据是否是可变。如果是可变类型,则拷贝最顶层。如果是不可变类型,则拷贝其引用。

import copy

a = [11, 22, 33]
b = (11, 22, 33)

c = copy.copy(a)
d = copy.copy(b)

print(id(a), id(c))
print(id(b), id(d))

二、什么是深拷贝

  对一个对象的所有层次的拷贝(递归拷贝)称为 深拷贝。我们可以使用 copy 模块中的 deepcopy() 方法实现深拷贝。

深拷贝

import copy

a = [11, 22, 33]
b = [33, 44, 55]
c = [a, b]
d = copy.deepcopy(c)

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

二、其它的拷贝方式

【1】、序列切片

  当使用序列切片拷贝的时候是 浅拷贝

a = [11, 22, 33]
b = [33, 44, 55]
c = [a, b]
d = c[:]

print(f"c: {c}")
print(f"d: {d}")
print(f"c == d: {c == d}")

print(f"id(c): {id(c)}")
print(f"id(d): {id(d)}")
print(f"c is d: {c is d}")

print(f"id(c[0]): {id(c[0])}")
print(f"id(d[0]): {id(d[0])}")

c[0][0] = 10
print(c)
print(d)

【2】、字典的 copy() 方法

  字典的 copy() 方法也是 浅拷贝

p1 = dict(name="Sakura", age=10, pet_phrase=["绝对没问题", "封印解除"])
p2 = p1.copy()

print(f"p1: {p1}")
print(f"p2: {p2}")
print(f"p1 == p2: {p1 == p2}")

print(f"id(p1): {id(p1)}")
print(f"id(p2): {id(p2)}")
print(f"p1 is p2: {p1 is p2}")

print(f"id(p1['pet_phrase']): {id(p1['pet_phrase'])}")
print(f"id(p2['pet_phrase']): {id(p2['pet_phrase'])}")

p1["pet_phrase"].append("变回你原来的样子")
print(f"p1: {p1}")
print(f"p2: {p2}")

标签:p2,25,p1,深浅,print,拷贝,copy,id
From: https://www.cnblogs.com/FlurryHeart/p/18516342

相关文章

  • Day25--arrays类
    Day25--arrays类Arrays类Arrays类是数组的工具类,位于java.util.Arrays。由于数组对象本身没有很多方法可供调用,API中提供了Arrays工具类以供使用,可对数组对象进行一些基本操作。Arrays类中的方法都是static修饰的静态方法,使用时可直接用类名调用(是“不用”而不是不......
  • Day25--NullPointerException
    Day25--NullPointerException在Java中,NullPointerException(空指针异常)是一种常见的运行时异常。当你在代码中尝试访问一个为null(空值)的对象引用时,就会抛出这个异常。例如,你试图调用一个null对象的方法或者访问一个null对象的字段。以下是一个可能会引发NullPointerExce......
  • 2025年的高新技术企业认定条件是什么?
    2025年高企认定标准是指高新技术企业认定的一系列具体要求和条件,这些标准涵盖了企业的研发能力、知识产权、科技成果转化率等多个方面。企业需满足包括但不限于注册成立时间、研发投入比例、高新技术产品收入占比等在内的多项指标,以确保其具备持续的创新能力和市场竞争力。了解......
  • 蓝桥杯备赛&学习计划 2024.11—2025.4
    学习计划概览2024年11月到12月-巩固基础,学习基本算法。2025年1月到2月-学习中级算法和数据结构。2025年3月-进阶算法学习和刷题练习。2025年4月-复习重点知识,专注于比赛准备。详细周计划2024年11月:基础知识&基础算法第1-2周:复习基本控制结构(循环、条件语......
  • 2025年计算机专业毕业设计选题推荐 速存
    2025年计算机专业毕业设计选题推荐博主介绍CSDN特邀作者、博客专家、CSDN新星计划导师Java领域优质创作者,荣获“博客之星”称号掘金、华为云、阿里云、InfoQ等平台优质作者专注于Java技术及学生毕业项目实战指导高校教师/讲师,擅长同行交流合作文末获取源码联系方式主要内......
  • 2025年计算机专业毕业设计选题推荐
    2025年计算机专业毕业设计选题推荐博主介绍CSDN特邀作者、博客专家、CSDN新星计划导师Java领域优质创作者,荣获“博客之星”称号掘金、华为云、阿里云、InfoQ等平台优质作者专注于Java技术及学生毕业项目实战指导高校教师/讲师,擅长同行交流合作文末获取源码联系方式主要内......
  • Oracle、MySQL、ClickHouse的通用AES256加解密如何实现?
     Oracle、MySQL、ClickHouse的通用AES256加解密如何实现? 前段时间研究了加密算法aes,写了个文档,分享到博客上来。防。1  说明应XXX安全生产需求,对目标库目标表业务字段敏感信息进行加密密文存放,查询时通过解密得到明文进行数据使用,要求使用AES256。目前公司所使用主要......
  • 20222313 2024-2025-1 《网络与系统攻防技术》实验三报告
    实验内容1.1实践内容正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧通过组合应用各种技术实现恶意代码免杀用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本1.2回答问题杀软是如何检测出恶意代码的?(1)特征码......
  • 八股文: 讲讲什么是浅拷贝、深拷贝?
    引言说起浅拷贝和深拷贝可以说是面试中经常碰到的经典问题,并且在实际项目开发过程中,也常常会因为数据拷贝问题,导致一些隐藏的BUG在javascript中有很多方法能够复制对象,但是如果你对数据拷贝不是很了解,在复制对象时就会很容易掉进陷阱里,那么我们怎样才......
  • 《使用Gin框架构建分布式应用》阅读笔记:p251-p271
    《用Gin框架构建分布式应用》学习第14天,p251-p271总结,总21页。一、技术总结1.Docker&DockerComposeversion:"3.9"services:api:image:apienvironment:-MONGO_URI=mongodb://admin:password@mongodb:27017/test?authSource=admin&readPreference=p......