1.深拷贝和浅拷贝深拷贝:赋值时,将值完全复制,全量复制,对其中一个进行修改不会影响另一种浅拷贝:赋值时,引用赋值相当于取了一个别名。修改其中一个会影响另一个对于PHP来说,=赋值时,普通对象是深拷贝,但是对于对象来说,是浅拷贝,即引用赋值。当一个对象作为参数传递时,无论参数前是否有&引用符号,都将被视为赋值引用。对于python来说,情况可能有点复杂,因为在python中一切都是对象,所以python的普通赋值、深拷贝和浅拷贝有着细微的区别。二、他们在phpphp5下,对象的=赋值和传递都是引用。为了实现复制,PHP提供了clone函数的实现。clone制作完整副本。但是在克隆的时候,我们可能不想复制源对象的所有内容,这时我们可以使用__clone来操作。请看下面代码段:a=2;//修改m,n也改变echo$n->a;//输出2,浅拷贝echoPHP_EOL;?>因为对象赋值时的引用,为了实现值的拷贝,php提供了clone函数来实现对象的拷贝。但是,克隆功能存在问题。克隆对象时,原始对象的普通属性可以按值复制,但源对象的对象属性仍然是引用赋值和浅拷贝。obj=newTest();}}$m=newTestOne();$n=$m;//这是一个完整的浅拷贝,不管是普通属性还是对象属性$p=clone$m;//普通属性实现了深拷贝,改变普通属性b不会影响源对象$p->b=2;echo$m->b;//输出原来的1echoPHP_EOL;//对象属性为浅拷贝,改变属性中的对象a,源对象m中的对象属性中的a也改变$p->obj->a=3;echo$m->obj->a;//输出3,随着新对象的改变?>如果要实现对象真正的深拷贝有两种方式:1.使用序列化和反序列化实现obj=newTest();}}$m=newTestOne();//方法二、序列化和反序列化实现对象深拷贝$n=serialize($m);$n=反序列化($n);$n->b=2;echo$m->b;//输出原来的1echoPHP_EOL;//可以看到,公共属性实现了深拷贝,改变公共属性b不会影响源对象$n->obj->a=3;echo$m->obj->a;//输出1,不随新对象改变,还是保持原来的属性,可见序列化和反序列化可以实现对象的深拷贝?>2.编写clone函数obj=newTest();}//方法一:重写克隆函数publicfunction__clone(){$this->obj=clone$this->obj;}}$m=newTestOne();$n=clone$m;$n->b=2;echo$m->b;//输出原来的1echoPHP_EOL;//可以看到普通属性的深拷贝已经实现,改变普通属性b不会影响源object//由于重写增加了clone功能,现在对象属性也实现了真正的深拷贝。新对象的改变不会影响源对象$n->obj->a=3;echo$m->obj->a;//输出1.不随新对象改变,或保持原有属性?>3.他们在python下“一个对象的浅拷贝其实就是创建一个和原对象同类型的新对象,但是内容是对原对象元素的引用换句话说,就是复制的对象本身是新的,但它的内容不是”,来自《Python核心编程》。这是我个人对python下浅拷贝和深拷贝的理解:赋值:简单的拷贝对象的引用,两个对象的id相同。浅拷贝:创建一个新的复合对象,它与原始对象共享内存中的子对象。深拷贝:新建一个组合对象,同时递归复制所有子对象。新组合的对象与原对象没有任何关系。尽管不可变子对象实际上是共享的,但它们彼此的独立性不受影响。浅拷贝和深拷贝的区别仅在于复合对象。所谓的复合对象是包含其他对象的可变对象,例如列表和类实例。对于数字、字符串等“原子”类型,没有所谓的复制,生成的都是对原始对象的引用。希望下面的代码可以进一步帮助你;#!/usr/bin/python#-*-coding:UTF-8-*-importcopy#浅拷贝a=[1,"a",3,[4,5,6],[[7,8,9]]]b=ac=list(a)d=copy.deepcopy(a)print"原始地址&&&"printid(a)print"分配地址&&&"printid(b)print"浅拷贝地址&&&"printid(c)print"深拷贝地址&&&"printid(d)print"赋值地址###"fori,jinzip(a,b):printid(i),id(j)print"浅拷贝地址###"fori,jinzip(a,c):printid(i),id(j)print"deepcopyaddress###"fori,jinzip(a,d):printid(i),id(j)print"######"a[0]=2a[3][0]=14print"原值变为%d,%d"%(a[0],a[3][0])print"******"print"assignmentchange"printb[0],b[3][0]print"shallowCopychange"printc[0],c[3][0]print"deepcopychange"printd[0],d[3][0]print"**##$$"printa输出结果如下:参考博文http://www.cnblogs.com/taijun。..http://blog.csdn.net/u0115085...http://www.cnblogs.com/zxlove...
