好友
阅读权限10
听众
最后登录1970-1-1
|
楼主说得已经很好了。下面,我自己补充点吧!
1,浅拷贝,没有拷贝到子对象。所以原始数据改变,没有被拷贝到的子对象会改变
[Python] 纯文本查看 复制代码 1 2 3 4 | i1 = { 'k3' : [ 'hijack' , 678 ], 'k2' : 123 , 'k1' : 'hi' }
import copy
i2 = copy.copy(i1)
i3 = copy.deepcopy(i1)
|
现在改变原数据(最外层的),因为深拷贝和浅拷贝都涉及到了这一层,所以这一层的数据改变,不会影响拷贝的内容
[Python] 纯文本查看 复制代码 1 2 3 4 5 6 7 | >>> i1[ "k4" ] = "add_data_test"
>>> i2
{ 'k3' : [ 'hijack' , 678 ], 'k2' : 123 , 'k1' : 'hi' }
>>> i3
{ 'k3' : [ 'hijack' , 678 ], 'k2' : 123 , 'k1' : 'hi' }
>>> i1
{ 'k3' : [ 'hijack' , 678 ], 'k2' : 123 , 'k1' : 'hi' , 'k4' : 'add_data_test' }
|
现在改变原数据(最内层的),因为深拷贝没有涉及到这一层,所以浅拷贝的结果会受到影响,而深拷贝的话,里面的对象也是被拷贝了的,所以值不会被改变
[Python] 纯文本查看 复制代码 1 2 3 4 5 6 7 8 | >>> i1[ "k3" ].append( "k3_test" )
>>> i1
{ 'k3' : [ 'hijack' , 678 , 'k3_test' ], 'k2' : 123 , 'k1' : 'hi' , 'k4' : 'add_data_test' }
>>> i2
{ 'k3' : [ 'hijack' , 678 , 'k3_test' ], 'k2' : 123 , 'k1' : 'hi' }
>>> i3
{ 'k3' : [ 'hijack' , 678 ], 'k2' : 123 , 'k1' : 'hi' }
>>>
|
总结:copy.copy()这个方法得到的对象是新对象,但是数据还是引用。
如果要完全得到一个新的一模一样的对象,要用copy.deepcopy()方法。这样,在改变新对象的时候,原对象才能不受影响,也就是保持原始数据不变
|
|