Python中的深拷贝和浅拷贝区别

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可变和不可变。
不可变:Number(数字)、String(字符串)、Tuple(元组)。
可以变:List(列表)、Dictionary(字典)、Set(集合)。

浅拷贝

copy模块里面的copy方法实现。
浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。

代码演示

import copy
class Father(object):
    def __init__(self, age):
        self.age = age;

    #定义共有属性
    age = 44;
    name= ['feige','666'];

    #私有方法访问共有属性
    def printName(self):
        print('the name of father is:'+self.name);

    #共有方法访问私有属性!
    def printAge(self):
        print('the age of father is :'+str(self.age));

#进行浅拷贝
f1 = Father(24);
f2 = copy.copy(f1);

#测试两个爹地址是否相同
print(id(f1));
print(id(f2));
#结果
58195728
58785040

#测试两个爹年龄地址是否相同
print(id(f1.age));
print(id(f2.age));
#结果
1392272848
1392272848

#测试两个爹名字地址是否相同
print(id(f1.name));
print(id(f2.name));
#结果
1392272848
1392272848

#改变爹1年龄,爹2不会改变。
f1.age = 66;
print(f2.age);
#结果:24

#因为name地址相同,且是可变对象,所以,爹2改名字了,爹1也会改变。
f1.name[0] = 'Niu Bi';
print(f2.name);
#结果
['Niu Bi', '666']

深拷贝

copy模块里面的deepcopy方法实现。
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了。

代码演示

import copy
class Father(object):
    def __init__(self, age):
        self.age = age;

    #定义共有属性
    age = 44;
    name= ['feige','666'];

    #私有方法访问共有属性
    def printName(self):
        print('the name of father is:'+self.name);

    #共有方法访问私有属性!
    def printAge(self):
        print('the age of father is :'+str(self.age));

#进行浅拷贝
f1 = Father(24);
f2 = copy.deepcopy(f1);

#测试两个爹地址是否相同
print(id(f1));
print(id(f2));
#结果
45416208
51642064

#测试两个爹年龄地址是否相同
print(id(f1.age));
print(id(f2.age));
#结果
1392272848
1392272848

原文地址:https://www.cnblogs.com/feiqiangsheng/p/11026911.html

时间: 2024-10-14 13:14:12

Python中的深拷贝和浅拷贝区别的相关文章

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

python中的深拷贝和浅拷贝

1.深拷贝VS浅拷贝 python中的深拷贝和浅拷贝和java里面的概念是一样的, 所谓浅拷贝就是对引用的拷贝 (里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间) 所谓深拷贝就是对对象的资源的拷贝 (里面的数据拷贝出来.深拷贝有自己的存储空间,有自己定义的数据,跟原对象一点关系也没有) 2.对赋值的认识: 赋值:将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ) 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空

python中的深拷贝和浅拷贝理解

在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用.以下分两个思路来分别理解浅拷贝和深拷贝: 利用切片操作和工厂方法list方法拷贝 利用copy中的deepcopy方法进行拷贝 1.利用切片操作和工厂方法list方法拷贝 代码场景:有一个小伙jack,tom通过切片操作拷贝jack,anny通过工厂方法拷贝jack. >>> jack = ['jack', ['age', 20]] &g

Python中的深拷贝与浅拷贝

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象,而是直接引用,也就是类似于添加了一个链接而已,两个变量指向的是同一块内存地址. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象.是会开辟一个新的内存,存放数据,就是两块不同内存. import copy li = [1,1,2,3,4,5,6,7,7,8] #li2=li #两个list地址是一样的,称为浅拷贝 # li2=li[:] #复制成一

python学习系列--深拷贝和浅拷贝

概念 普通情下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用.把新的对象置于新的内存空间中,才是拷贝.在python中,深浅拷贝的区别实际上是拷贝的深度不同. 操作 常见的'='号就是一种拷贝方式.python在复制对象时实际上是调用copy模块的copy方法,即copy.copy().而使用deepcopy()函数操作就是深拷贝.对于字符串和数字来说,不管是深拷贝还是浅拷贝,都只是在原有内存地址上的新引用,所以是没有区别的.可

浅谈Java中的深拷贝和浅拷贝

浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: [java] view plaincopyprint? int apples = 5; int pears = apples; int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float

FAQ:Python中*args和**agrs的区别

python提供了两种特别的方法来定义函数的参数: 1. 位置参数 *args,  把参数收集到一个元组中,作为变量args   >>>def show_args(*args):          #定义函数 print args >>>show_agrs("hello", "world")      #调用函数 输出:("hello","world") 2. 关键字参数 **kwargs,

python中linspace()和arange()的区别

python中linspace()和arange()的区别 今天无意间看到linspace(0,4,5)可以产生一个array([0,1,2,3,4])的数组,不知道里面的参数是什么,于是就有了这篇博文. linspace( ) linspace()通过指定开始值.终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值.看如下例子 arange( ) arange()通过指定开始值.终值(不包含终值)和步长创建表示等差数列的一维数组,

Java中的深拷贝和浅拷贝 原型模式

1: Java中浅拷贝和深拷贝的定义:      浅拷贝:就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.      深拷贝:就是两个对象的值相等,但是互相独立. (深拷贝才是真正的拷贝,浅拷贝只是将引用指向了同一份对象) 2:Java中几种常见的拷贝操作: (1)"="操作:也就是赋值操作: (2)拷贝构造函数:拷贝构造函数就是构造函数的参数的类型是该构造函数所在的类,即参数就是该类的一个对象. <span style="font-size: