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

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

浅拷贝和深拷贝示意图

如上图,简单点说

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

2. copy.deepcopy 深拷贝 拷贝对象及其子对象

数字,字符串是不可变类型

列表,字典是可变类型

我们看下面的案例

案例一:浅拷贝

>>> import copy    
#导入copy模块
 
            
>>> s=[‘name‘,[‘savings‘,100.0]]
#赋值给s

>>> t=copy.copy(s)
#将s浅拷贝给t

>>> s
[‘name‘, [‘savings‘, 100.0]]
>>> t
[‘name‘, [‘savings‘, 100.0]]
>>> id(s)
139814645224224
>>> id(t)
139814645264184
#查看s和t的内存空间地址,发现s和t的内存空间地址不一样

>>> id(s[0])
139814648512112
>>> id(t[0])
139814648512112

>>> id(s[1])
139946237132672
>>> id(t[1])
139946237132672
#查看s和t的子对象的内存空间地址,发现s和t的子对象的内存空间地址一样
#以上证明浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象

>>> s.append(‘age‘)
>>> s
[‘name‘, [‘savings‘, 100.0], ‘age‘]
>>> t
[‘name‘, [‘savings‘, 100.0]]
#s添加‘age‘字符串,但是t并没有添加

>>> s[0]=‘job‘
>>> s
[‘job‘, [‘savings‘, 100.0], ‘age‘]
>>> t
[‘name‘, [‘savings‘, 100.0]]
>>> s[1][1]=200.0
>>> s
[‘job‘, [‘savings‘, 200.0], ‘age‘]
>>> t
[‘name‘, [‘savings‘, 200.0]]
#当我们修改s的‘name‘时t并没有修改,但是当我修改s的100.0时t也被修改了
#数字、字符串是不可变类型,t并不会跟着s一起被修改
#列表,字典为可变类型,t会随s的修改而被修改,100.0是属于s里的列表的值

案例二:深拷贝

>>> import copy
#导入copy模块 

>>> s=[‘name‘,[‘savings‘,100.0]]
#赋值给s

>>> t=copy.deepcopy(s)
#将s浅拷贝给t

>>> s
[‘name‘, [‘savings‘, 100.0]]
>>> t
[‘name‘, [‘savings‘, 100.0]]
#查看s和t的值

>>> id(s)
140329642791784
>>> id(t)
140329642793080
#查看s和t的内存空间地址,发现s和t的内存空间地址不一样

>>> id(s[0])
140329646079600
>>> id(t[0])
140329646079600
#查看s和t的子对象‘name‘的内存空间地址,发现s和t的子对象‘name‘的内存空间地址一样

>>> id(s[1]) 
140329642729344
>>> id(t[1])
140329642831240
#查看s和t的子对象[‘savings‘,100.0]的内存空间地址,发现s和t的子对象[‘savings‘,100.0]的内存空间地址不一样
#以上证明深拷贝会拷贝对象及其子对象

>>> s.append(‘age‘)
>>> s
[‘name‘, [‘savings‘, 100.0], ‘age‘]
>>> t
[‘name‘, [‘savings‘, 100.0]]
#s添加‘age‘字符串,但是t并没有添加

>>> s[0]=‘job‘
>>> s
[‘job‘, [‘savings‘, 100.0]]
>>> t
[‘name‘, [‘savings‘, 100.0]]
>>> s[1][1]=200.0
>>> s
[‘name‘, [‘savings‘, 200.0], ‘age‘]
>>> t
[‘name‘, [‘savings‘, 100.0]]
#当我们修改s的‘name‘时t没有被修改,但是当我修改s的100.0时t也没被修改
#证明s和t是完全分离开来的,没有任何关联

总结:

浅拷贝时,当我们修改s的子对象(字典和列表等可变类型)时,t也会跟着改变。但是s添加对象时,t并不会添加

深拷贝时,s和t的内容完全分离开来,添加或修改s的对象时t并不会跟着改变

时间: 2024-10-28 12:52:40

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

python列表--浅拷贝与深拷贝的区别

首先得说说列表为什么需要拷贝,就是为了解决简单赋值操作,传地址的问题,因为赋值过去的列表,其实指向的是同一个地址,问题说明看代码 a = [1,2,3] b = a # list类型,简单赋值操作,是传地址 print(id(a)) print(id(b)) b[1] = 6 print(b) print(a) 执行结果,输出的是: 2460317409864 2460317409864 [1, 6, 3] [1, 6, 3] #同一地址,修改b的列表,a也会同时改变. 为了解决以上问题,lis

python中赋值,浅拷贝,深拷贝的区别

1.首先,对被操作对象分类,对于不可变对象而言,如字符串.数字.tuple等,这三种操作是等价的,都是引用 import copy a='apple'b=ac=copy.copy(a)d=copy.deepcopy(a)print(id(a))print(id(b))print(id(c))print(id(d) 输出: 1840734496184073449618407344961840734496 可见,这四个变量都指向同一块内存地址,即'apple'这个字符串所在的地址 2.对可变对象(或

C# 中浅拷贝与深拷贝区别

转:https://www.cnblogs.com/xugang/archive/2010/09/09/1822555.html 也许会有人这样解释C# 中浅拷贝与深拷贝区别: 浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝. 不能说它完全错误,但至少还不够严谨.比如:string 类型咋说? 其实,我们可以通过实践来寻找答案. 首先,定义以下类型: int .string .enum .struct .class .int[ ] .string[ ] 代码如下:     //枚举     p

js中对象的浅拷贝和深拷贝的区别

js中对象的浅拷贝和深拷贝的区别 浅度拷贝:复制一层对象的属性,并不包括对象里面的为引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变. 深度拷贝:重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型.两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性. 数据的类型: 一般数据(值传递):字符,数值,布尔,undefined 拷贝(复制)时,传递的是值,修改新数据,不会影响老数据 复杂数据(引用传递):对象 拷贝(复制)时,传递的是内存地址的

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()通过指定开始值.终值(不包含终值)和步长创建表示等差数列的一维数组,

Python中type与Object的区别

Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: class object The most base type 从介绍上看这也是Python对类型统一做出的努力.所以这里的object与Java的Object类有着异曲同工之妙,而且可以推测这个object很可能就是一个定义了一个类型的"空类" 再来看type的说明: class type(ob

python中split()和split(' ')的区别

总结:split()的时候,多个空格当成一个空格:split(' ')的时候,多个空格也要分割,会分割出来空. 例1: 牛客网:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可

Python中的is和==的区别,is判断值是否相等,id判断地址是否一致

Python中的is和==的区别 Python中的对象包含三要素:id.type.value. 其中id用来唯一标示一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是b对象,是通过id来判断的. ==判断的是a对象的值是否和b对象的值相等,是通过value来判断的. 看下边的例子: >>> s=set("1234") >>> s set(['1', '3', '2', '4']) >>> ss=s.