关于浅拷贝,深拷贝

浅拷贝:字符串被显示的拷贝,列表元素的引用被拷贝,因此修改例如字符串这种不可变的值,不会在被拷贝的对象中有改变。

深拷贝:字符串被显示的拷贝,列表被完全拷贝(创建了一个新对象,内容和之前的列表一致)。

不管是浅拷贝还是深拷贝,被拷贝的字符串这种不可变的值一开始的id都是一样的,不管是深浅都是新建了一个对象,而不是像引用赋值那样只是多加了一个对对象的引用。

下面用id()函数来说明这种变化。

>>> p = [‘name‘, [‘saving‘, 100]]
>>> h = p[:]
>>> [id(x) for x in p, h]
[4490260704, 4490336016]

浅拷贝的两个对象id不同,说明是两个对象。但是如果只是增加了一个对对象的引用,那么id就完全一样。

>>> p
[‘name‘, [‘saving‘, 100]]
>>> x = p
>>> [id(x) for x in p, x]
[4490260704, 4490260704]

接着说重点,浅拷贝的两个对象本身的id就不同,然后我们看其中的元素,经测试,没被修改的浅拷贝中的不可变元素(name)id一致,这里我们不探讨这个,重点在后面的list,看看二者的id知否一致。

>>> p
[‘name‘, [‘saving‘, 100]]
>>> h
[‘name‘, [‘saving‘, 100]]
>>> [id(x[1]) for x in p, h]
[4490174336, 4490174336]

我们再试试深拷贝。

>>> p
[‘name‘, [‘saving‘, 100]]
>>> import copy
>>> w = copy.deepcopy(p)
>>> [id(x[1]) for x in p, h, w]
[4490174336, 4490174336, 4490337744]

我们可以发现,深拷贝的list的id却是变了,说明是完全新建了一个list对象。

我们再试试不可变元素。

>>> p
[‘name‘, [‘saving‘, 100]]
>>> h
[‘name‘, [‘saving‘, 100]]
>>> [id(x[0]) for x in p, h]
[4489215600, 4489215600]
>>> h[0] = ‘hs‘
>>> [id(x[0]) for x in p, h]
[4489215600, 4490618080]

id不同,说明现在name处的string是完全两个元素了。

下面试一下元组,如果元组中的元素只包含不可变对象,那么对他进行深拷贝会发生什么。

>>> p
[‘name‘, (‘saving‘, 100)]
>>> w = copy.deepcopy(p)
>>> [id(x[1]) for x in p, w]
[4490184464, 4490184464]

可以发现,如果元组中的元素都是不可变类型,那么对元组进行深拷贝也是浅拷贝。

我们再试下如果元组中包含list的情况。

>>> p
[‘name‘, (‘saving‘, [100])]
>>> w = p[:]
>>> del w
>>> w = copy.deepcopy(p)
>>> [id(x[1]) for x in p, w]
[4490184392, 4490181520]

如果元组中包含可变对象,那么深拷贝对元组的深拷贝就是起作用。

总结:浅拷贝拷贝的是可变对象的引用,真正的深拷贝是新建了一个对象,内容跟原来的一致。

时间: 2024-08-14 17:56:43

关于浅拷贝,深拷贝的相关文章

JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

$.extend()浅拷贝深拷贝

参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.extend()指定了一个参数,则意味着参数target被省略.此时,target就是jQuery对象本身.通过这种方式,我们可以为全局对象jQuery添加新的函数.2. 如果多个对象具有相同的属性,则后者会覆盖前者的属性值.   1 <!DOCTYPE html> 2 <html lang=&

Java求幂集与List的浅拷贝深拷贝问题

求幂集 使用回溯法,主要看集合里每一个元素在与不在链表中,在与不在都会创建一个新的解: import java.util.ArrayList; import java.util.List; public class p78 { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result=new ArrayList<List<Integer>>(

Python练习四-浅拷贝&amp;深拷贝

一.数字.字符串不论是浅拷贝.深拷贝都是指向一个地址. a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b print (id(a1),id(b1)) a2 = copy.copy(a) b2 = copy.copy(b) print (id(a2),id(b2)) a3 = copy.deepcopy(a) b3 = copy.deepcopy(b) print (id(a3),id(b3)) 二.列表.元组.字典的浅拷

python浅拷贝深拷贝

copy_list=list[:]  得到的是浅拷贝,即只能顶层拷贝,里面的嵌套不会复制一份. 深拷贝方法如下: import copy a = [0, [1, 2], 3] b = copy.deepcopy(a) a[0] = 8 a[1][1] = 9 int,float,long,str,tuple为不可变对象 list,set,dict为可变对象 不可变对象指的是值的不可变,所以它的每一次操作都会重建对象 打个比方: a=1 a=2 这里虽然看上去a的值可以改变,但其实是创建了一个新的

python之浅拷贝深拷贝

之前一直不明白python中的浅拷贝和深拷贝是个鸟意思,通过一段时间的学习,总算是明白了些,所以就写出来让自己加深点印象,并在与大家分享和交流! #浅拷贝命令 copy.copy(x) Return a shallow copy of x. 返回一个个浅拷贝 x #深拷贝命令 copy.deepcopy(x) Return a deep copy of x. 返回一个深拷贝 x 浅拷贝新创建一个对象并且插入到与之相关的对象或者引用者的身上. 深拷贝同样是创建一个新对象,但是是递归拷贝对象,并且插

Java原型模式之浅拷贝-深拷贝

一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: (1)关于Object类的clone方法 默认实现为"浅拷贝",重写Object类中的clone方法.Java中全部类的父类都是Object类,Object类中有一个clone方法.作用是返回对象的一个拷贝,可是其作用域是protected类型的,一般的类无法调用,因此Prototype类

python学习笔记七:浅拷贝深拷贝

原理 浅拷贝 import copy b = copy.copy(a) demo: >>> a=[1,['a']] >>> b=a >>> c=copy.copy(a) >>> a [1, ['a']] >>> b [1, ['a']] >>> c [1, ['a']] >>> id(a) 140556196249680 >>> id(b) 14055619624

Python 浅拷贝 深拷贝 及引用机制

这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在python中,这样的赋值语句,其实内部含义是指a指向这个list所在内存地址,可以看作类似指针的概念. 而b,注意,他是把a对象包裹进一个list,并且乘以5,所以b的样子应该是一个大list,里面元素都是a 而当a对象进行了append操作后,其实,隐含的意思是,内存中的这个l

关于js 浅拷贝 深拷贝 以及赋值操作。

最近同事又碰到关于深浅拷贝以及赋值的问题,今天我也研究一下记录一下,加深一下记忆. 举一个简单的例子: var people = { age:10, name:"小华", arr:[1,2,3] }; 做一个 赋值操作: var people2 = people; 然后做一个浅拷贝操作: var people3 = {}; for (var i in people){ people3[i] = people[i] }; 然后最后再做一个深拷贝操作: function deepClone