首页 > 其他分享 >深拷贝和浅拷贝

深拷贝和浅拷贝

时间:2025-01-17 13:32:54浏览次数:3  
标签:对象 嵌套 复制 拷贝 copy original

在Python中,深拷贝浅拷贝是两种常见的对象复制方法,它们之间的区别在于如何处理对象中的子对象。具体来说:

1. 浅拷贝(Shallow Copy)

  • 定义:浅拷贝创建一个新的对象,但不会复制对象中的嵌套对象(如列表、字典中的元素等)。而是将原对象中嵌套的子对象的引用复制到新对象中。
  • 结果:新对象与原对象中的子对象共享内存地址,修改嵌套子对象会影响到原对象。
  • 常用方法:使用copy模块中的copy()函数,或者使用对象的copy()方法(例如,list.copy())。
  • 适用场景:当你只需要复制对象的外层结构,而不修改内部嵌套对象时,可以使用浅拷贝。

代码示例

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(original)

# 修改浅拷贝中的嵌套列表
shallow_copy[0][0] = 10

print(original)  # [[10, 2, 3], [4, 5, 6]]  原对象中的子对象也改变了
print(shallow_copy)  # [[10, 2, 3], [4, 5, 6]]

2. 深拷贝(Deep Copy)

  • 定义:深拷贝创建一个新的对象,并且递归地复制对象中的所有子对象,即不仅复制外层对象,还会复制对象中的嵌套对象。这样新对象与原对象完全独立,修改新对象的嵌套子对象不会影响原对象。
  • 结果:新对象和原对象都拥有独立的内存空间,不会共享任何子对象的引用。
  • 常用方法:使用copy模块中的deepcopy()函数。
  • 适用场景:当需要完全独立于原对象的一个副本,并且不希望任何修改影响到原对象时,使用深拷贝。

代码示例

import copy

original = [[1, 2, 3], [4, 5, 6]]
deep_copy = copy.deepcopy(original)

# 修改深拷贝中的嵌套列表
deep_copy[0][0] = 10

print(original)  # [[1, 2, 3], [4, 5, 6]]  原对象没有变化
print(deep_copy)  # [[10, 2, 3], [4, 5, 6]]

总结:

  • 浅拷贝:仅复制对象本身,嵌套对象共享引用,修改嵌套对象会影响原对象。
  • 深拷贝:复制对象及其所有嵌套对象,修改新对象不会影响原对象,二者完全独立。

注意:

  • 浅拷贝适用于你只关心外层对象而不修改嵌套对象的场景。
  • 深拷贝适用于你需要完全独立复制一个对象及其所有嵌套对象的场景。

标签:对象,嵌套,复制,拷贝,copy,original
From: https://blog.csdn.net/weixin_49364648/article/details/145205240

相关文章

  • .NET 数据拷贝方案选择
     应用中我们经常使用到数据的复制,在.NET中有多种方式可以实现复制数据或对象。选择哪种方式、是浅拷贝还是深拷贝,具体需求场景可以取决于对象的复杂性、数据量等,本文我们介绍主要的拷贝方式以及相对高性能的方案。 1.MemberwiseClone拷贝浅拷贝 Object.MemberwiseClone方法......
  • 拷贝构造函数
    文章目录一、4.拷贝构造函数今天我们来学习拷贝构造函数。一、4.拷贝构造函数如果⼀个构造函数的第⼀个参数是自身类型的引用,且任何额外的参数都有默认值,则此叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。它的形式是这样的:#include<iostream>usin......
  • Effective C++读书笔记——item12(自定义拷贝构造函数和拷贝赋值运算符可能出现的问题
    1.拷贝函数相关背景及编译器行为在面向对象系统中,拷贝构造函数和拷贝赋值运算符统称为拷贝函数,若不自行声明,编译器会按需生成默认的拷贝函数,其会拷贝被拷贝对象的全部数据。但当自行声明拷贝函数后,编译器若发现实现存在错误,往往不会主动提示,比如在新增数据成员却未更新拷贝函......
  • ROBOCOPY Windows文件拷贝神器
    ROBOCOPY,即RobustFileCopy,是Windows操作系统中一个命令行实用程序,用于文件和目录的复制。它最初是作为XCOPY的替代品开发的,提供了更多的功能和更好的可靠性。ROBOCOPY能够处理大规模的数据复制任务,并且在遇到错误时具备重试机制,可以跳过不可用的文件,继续复制其余的文件,这使得它......
  • python 赋值、深拷贝浅拷贝及切片使用
    赋值、深浅拷贝先复习一下赋值与深浅拷贝i=[1,2,1,3,[1,2]]j=i#赋值k=i.copy()#浅拷贝m=copy.deepcopy(i)#深拷贝#赋值,二者物理地址相同,一方变化另一方同步变化j.pop(0)print(i,j)[2,1,3,[1,2]][2,1,3,[1,2]]#取浅拷贝,二者物理......
  • Object.assign()是浅拷贝还是深拷贝?
    Object.assign()在JavaScript中是执行浅拷贝(shallowcopy)的。这意味着,它只复制对象的顶层属性和值。如果对象的属性值是一个引用类型(例如,数组或另一个对象),Object.assign()不会复制这个引用类型的实际内容,而是复制这个引用本身。因此,原对象和新对象会共享这个引用,对一个对象的......
  • memmove函数:内存重叠时拷贝
    最近测试遇到一个memcpy在x86和arm平台上拷贝字节时不一致的问题。出现拷贝是memcpy函数少量字节拷贝错误。分析参考:https://blog.csdn.net/shuidaoqingyi520/article/details/131669163在内存有重合的时候memcpy是不稳定的,要使用memmove函数。我于是自己写了个简单代码对比#i......
  • 【Java基础面试题041】Java中的深拷贝和浅拷贝有什么区别?
    回答重点深拷贝:深拷贝不仅复制对象本身,还递归复制对象中所有引用的对象。这样新对象与原对象完全独立,修改新对象不会影响到原对象。即包括基本类型和引用类型,堆内的引用对象也会复制一份浅拷贝:浅拷贝只复制对象的引用,而不复制引用指向的实际对象,也就是说,浅拷贝创建一个新对象......
  • 在C#中如何实现集合的深拷贝
    在C#中,实现集合的深拷贝(deepcopy)涉及创建一个新的集合,并递归地复制原始集合中的所有元素及其嵌套的对象。深拷贝与浅拷贝(shallowcopy)的区别在于,深拷贝不仅复制对象的引用,还复制对象本身及其包含的所有子对象。以下是一些常见集合类型(如List、Dictionary等)的深拷贝实现方......
  • 一道比亚迪前端面试题:深拷贝和浅拷贝有什么区别?
    大家好,我是小寒。最近有朋友参加了比亚迪的前端面试,又被问到了一道经典的前端面试题:深拷贝和浅拷贝有什么区别?本期一起来盘一下这道题。一、深拷贝和浅拷贝浅拷贝的特点:只拷贝第一层对于基本数据类型,拷贝值对于引用数据类型,拷贝引用深拷贝的特点:多层递归拷贝对于基本......