天天看点

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

浅拷贝(shallow copy)

copy(x) 创建新的复合对象并通过引用复制x的成员来创建x的浅复制。

更加深层次说,它复制了对象,但对于对象中的元素,依然使用引用。

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

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

所以浅copy需要注意:

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

2.在副本字典中修改可变对象,那么原始字典的内容会被影响

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

例子1

a = {'Wangdachui': }
b = a.copy()
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)
a['Niuyun'] = 
print a
print b
print a is b
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)

output:

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

例子2

a = {'Wangdachui': }
b = a
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)
a['Niuyun'] = 
print a
print b
print a is b
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)

output:

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

例子3

info = [('Wangdachui', ), (, ), ('Linling', ), ('Tianqi', ['foo', 'bar', 'baz'])]
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)
#我们可以看到的info浅复制对象dict1,它们是不同的对象,所以对对象的改变是不会
#影响彼此的,但是这些info和dict1对象的元素是引用的同一个,所以info或者dict1更改了它的对象的元素就会影响到另外一个的值。
dict1 = dict(info)
print 'dict1 %s' % dict1

#同样的dict2又是dict1的浅复制对象
dict2 = dict1.copy()
print 'dict2 %s' % dict2
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)

output1:

dict1 {'Tianqi': ['foo', 'bar', 'baz'], : , 'Wangdachui': , 'Linling': }
dict2 {'Tianqi': ['foo', 'bar', 'baz'], : , 'Wangdachui': , 'Linling': }
           
#修改不可变对象
dict2['Wangdachui'] = 
#修改可变对象
dict2['Tianqi'].remove('bar')

print 'dict1 %s' % (dict1)
print 'dict2 %s' % dict2
print 'info %s' % info
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)

output2:

dict1 {'Tianqi': ['foo', 'baz'], : , 'Wangdachui': , 'Linling': }
dict2 {'Tianqi': ['foo', 'baz'], : , 'Wangdachui': , 'Linling': }
info [('Wangdachui', ), (, ), ('Linling', ), ('Tianqi', ['foo', 'baz'])]
           
#修改不可变对象
dict1['Linling'] = 
#修改可变对象
dict1['Tianqi'].append('add')

print 'dict1 %s' % (dict1)
print 'dict2 %s' % dict2
print 'info %s' % info
           
python 浅拷贝(shallow copy) 深拷贝(deep copy)浅拷贝(shallow copy)

output3:

dict1 {'Tianqi': ['foo', 'baz', 'add'], : , 'Wangdachui': , 'Linling': }
dict2 {'Tianqi': ['foo', 'baz', 'add'], : , 'Wangdachui': , 'Linling': }
info [('Wangdachui', ), (, ), ('Linling', ), ('Tianqi', ['foo', 'baz', 'add'])]