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

本文深入探讨了Python中浅拷贝的概念,解释了浅拷贝如何通过引用复制复合对象,并详细阐述了不可变对象与可变对象在浅拷贝过程中产生的不同影响。通过实例演示了浅拷贝在不同场景下的行为,包括对字典和列表中元素的修改情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅拷贝(shallow copy)

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

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

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

所以浅copy需要注意:

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

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

例子1

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

1-1

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

1-2

output:

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

例子2

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

2-1

a['Niuyun'] = 2000
print a
print b
print 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' % dict2
print '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' % dict2
print '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'])]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值