python 浅拷贝(shallow copy) 深拷贝(deep copy)

来源:互联网 发布:北京折叠 知乎 编辑:程序博客网 时间:2024/05/01 23:45

浅拷贝(shallow copy)

copy(x) 创建新的复合对象并通过引用复制x的成员来创建x的浅复制。
更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用。

既然浅拷贝用的是引用,为何我修改了一些值,却不会影响到它的拷贝副本呢?

那就是因为修改的是不可变对象,不可变对象发生变化时会生成新的引用指向新的值,也就不会对原有对象产生影响。

所以浅copy需要注意:

1.在副本字典中修改这些不可变对象(如字符串,数字,元组[只包含不可变对象的元组])是不会影响原始字典
2.在副本字典中修改可变对象,那么原始字典的内容会被影响

原因:不可变对象发生变化时会生成新的引用指向新的值,而可变对象的值发生变化时,不会生成新的引用

例子1

a = {'Wangdachui': 3000}b = a.copy()

1-1

a['Niuyun'] = 2000print aprint bprint a is b

1-2

output:

{'Wangdachui': 3000, 'Niuyun': 2000}{'Wangdachui': 3000}False

例子2

a = {'Wangdachui': 3000}b = a

2-1

a['Niuyun'] = 2000print aprint bprint a is b

2-2

output:

{'Wangdachui': 3000, 'Niuyun': 2000}{'Wangdachui': 3000, 'Niuyun': 2000}True

例子3

info = [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'bar', 'baz'])]

1


#我们可以看到的info浅复制对象dict1,它们是不同的对象,所以对对象的改变是不会#影响彼此的,但是这些info和dict1对象的元素是引用的同一个,所以info或者dict1更改了它的对象的元素就会影响到另外一个的值。dict1 = dict(info)print 'dict1 %s' % dict1#同样的dict2又是dict1的浅复制对象dict2 = dict1.copy()print 'dict2 %s' % dict2

这里写图片描述

output1:

dict1 {'Tianqi': ['foo', 'bar', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}dict2 {'Tianqi': ['foo', 'bar', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}

#修改不可变对象dict2['Wangdachui'] = 55555#修改可变对象dict2['Tianqi'].remove('bar')print 'dict1 %s' % (dict1)print 'dict2 %s' % dict2print 'info %s' % info

这里写图片描述

output2:

dict1 {'Tianqi': ['foo', 'baz'], 123: 2000, 'Wangdachui': 3000, 'Linling': 4500}dict2 {'Tianqi': ['foo', 'baz'], 123: 2000, 'Wangdachui': 55555, 'Linling': 4500}info [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'baz'])]

#修改不可变对象dict1['Linling'] = 55555#修改可变对象dict1['Tianqi'].append('add')print 'dict1 %s' % (dict1)print 'dict2 %s' % dict2print 'info %s' % info

这里写图片描述

output3:

dict1 {'Tianqi': ['foo', 'baz', 'add'], 123: 2000, 'Wangdachui': 3000, 'Linling': 55555}dict2 {'Tianqi': ['foo', 'baz', 'add'], 123: 2000, 'Wangdachui': 55555, 'Linling': 4500}info [('Wangdachui', 3000), (123, 2000), ('Linling', 4500), ('Tianqi', ['foo', 'baz', 'add'])]
1 0
原创粉丝点击