深拷贝、浅拷贝

(内容大多来自python核心编程)

创建一个python对象然后把它赋给另一个变量时,python仅仅是拷贝了这个对象的引用。

序列类型(字符串、列表和元组)的默认拷贝类型是浅拷贝,具体的施行方式有三种:

1、完全切片操作[:];2、利用 工厂函数,比如list(),dict()3、使用copy模块的copy函数

person=[‘name‘,[‘savings‘,100.00]]
hubby=person[:] #slice copy
wifey=list(persion) #fac func copy
hubby[0] = ‘joe‘
wifey[0] = ‘jane‘
bubby,wifey
([‘joe‘, [‘saving‘, 100.0]], [‘jane‘, [‘saving‘, 100.0]])
hubby[1][1] = 50.00
bubby,wifey
([‘joe‘, [‘saving‘, 50.0]], [‘jane‘, [‘saving‘, 50.0]])

在这里由于字符串是不可变类型,而列表是可变类型,因此在执行浅拷贝时,字符串被显式拷贝并创建了一个字符串对象,而列表则由于是同一个对象的引用,因此修改bubby会引起wifey对象的改变。

深拷贝:可以使用copy.deepcopy()函数

import copy
wifey = copy.deepcopy(person)

可以自行测试

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 16:52:21

深拷贝、浅拷贝的相关文章

深拷贝&浅拷贝

STRING.h文件 #pragma once #include<string.h> class String { public: String(char* str="")      //深拷贝 :_str(new char[strlen(str)+1]) { strcpy(_str, str); cout << "构造函数 " << endl; } ~String() { if (_str!=NULL) { delete[]_s

探讨一下iOS中深拷贝&amp;浅拷贝&amp;copy的那些事儿

什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是错误的? @property(nonatomic,copy)NSMutableString* name; copyWithZone方法又到底是干嘛用的? 接下来,我们将一起,一步一步的去揭晓问题的答案. Copy到底是个啥? 其实我们真的没必要把copy想的太高深.它之所以叫copy,其终极目的已不言而喻,

深拷贝 浅拷贝 引用计数

;深拷贝 浅拷贝 深拷贝(成员用到了指针存储空间地址)每个对象的成员都有自己独立的成员内存地址空间,造成了浪费 浅拷贝,把原对象的指针也直接拷贝过来我还是用的这一片空间,但是析构会有重复释放问题,解决重复释放用引用计数记录这个类产生了多少对象,析构的时候--引用计数就可以了 计数为0   delete 这块内存空间 ;引用计数技术 优点:所有对象共享同一片空间,间接的达到了对象间的数据共享 缺点:一旦一个对象改变了这片内存,那么所有的对象都受到影响 ;写时拷贝技术 当对象需要操作这一块空间存放数

深拷贝 浅拷贝 以及赋值运算符= 的重载

在一些程序当中,需要将一个对象里的值直接传递给另一个对象,需要进行对象的拷贝.但是在某些情况下也会出现错误,如类内部成员需要动态开辟内存,实行位拷贝,就是将一个对象的值完全复制给另一个对象,如A=B,但如果B中也有一个指针申请了内存,那么A中的成员变量也指向了同一块内存,如果当释放资源的时候,就会导致野指针的出现,出现错误. 深拷贝的简单理解 就是在复制对象内容的过程中,需要重新分配资源,而浅拷贝则是不要重新分配资源.但是浅拷贝存在着问题:当资源释放时会产生资源归属不清的问题,导致运行错误. 当

c# 通用类型系统 深拷贝 浅拷贝 函数传参

c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下,变量在内存级的表现情况,对以后的coding应该有些帮助.在此记录以免忘记了... 1. 通用类型系统 先来一张图: 通用数据类型分为了值类型和引用类型. 我们定义一个int型实际上是一个system.int32的实例,在语法上我们像使用其他的类对象一样,但是,存储的的仍然是基本类型.这种把基本类型

Java 深拷贝浅拷贝 与 序列化

一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会进行拷贝:(引用的对象只要求浅拷贝即可:若要深层拷贝,一般可利用序列化和反序列化来实现,也可手动实现各级引用对象的深层拷贝:) 二.实现: 浅拷贝:实现Cloneable接口,重写clone()方法,在clone()调用父类super.clone()即可: 深拷贝:1. 实现Cloneable接口,

深拷贝&amp;浅拷贝&amp;引用计数&amp;写时拷贝

(1).浅拷贝: class String { public: String(const char* str="") :_str(new char[strlen(str)+1]) { strcpy(_str,str); } ~String() { if(NULL!=_str) { delete[] _str; _str=NULL; } } private: char* _str; }; int main() { String s1("hello"); String

c# 深拷贝 浅拷贝

浅拷贝对引用类型只拷贝地址,拷贝前后共享一块内存区域.深拷贝就是所有的东西全部重新有一份,没有共享存在,推荐使用序列化深拷贝. using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace ConsoleApplication1 { internal class Program { [Serializable] public class TV { public TV()

一看就懂的,java深拷贝浅拷贝

前言 这两天,男票兴奋地通知我,我的博客终于有排名了,刚好是20000名,原来都是千里之外.我也比较兴奋,在这里谢谢每一个看到我文章的同学.O(∩_∩)O哈哈~,为什么有一种颁奖典礼的赶脚.真的啦,虽然我的博客写的都是比较浅显的基础知识,但是也是一字一字马上去的,有时候为了画图辅助说明,也是费很多时间的.O(∩_∩)O哈哈~,我写博客的目的,就是希望每一个看我博客的人,每看一篇文章都能不用费很多时间,把文章里面的东西弄懂.虽不是大牛,但是我会继续努力的. 话不多说,进入今天的主题吧.今天,依然要

C++深拷贝浅拷贝

深拷贝和浅拷贝的根本区别是变量和指针内存申请方式的不同导致的,如果对一一个变量则不存在深拷贝和浅拷贝的区别,对于一些类中包含指针的需要进行动态分配内存的进行拷贝的时候会有深拷贝和浅拷贝的区别 事例如下: 1 #include<iostream> 2 3 using namespace std; 4 5 class CE 6 { 7 private: 8 int a; 9 public: 10 CE(int b) 11 {a=b;} 12 }; 13 int main() 14 { 15 CE