python 浅copy与深copy_python深copy与浅copy的区别

本文详细介绍了Python中的对象复制,包括直接赋值、浅拷贝和深拷贝的区别。通过示例代码展示了它们在处理列表及子对象时的行为,阐述了它们如何影响变量的值和内存地址。重点讨论了`copy`模块的`copy()`和`deepcopy()`方法在对象复制中的应用。

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

首先先看一段代码

import copy

a = [1, 2, 3, [4]]

b = a

c = a.copy()

d = copy.deepcopy(a)

e = copy.copy(a)

a.append(4)

a[3].append(5)

print('a值为 {} 地址为 {}'.format(a, id(a)))

print('b值为 {} 地址为 {}'.format(b, id(b)))

print('c值为 {} 地址为 {}'.format(c, id(c)))

print('d值为 {} 地址为 {}'.format(d, id(d)))

print('e值为 {} 地址为 {}'.format(e, id(e)))

执行结果:

a值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360

b值为 [1, 2, 3, [4, 5], 4] 地址为 4555940360

c值为 [1, 2, 3, [4, 5]] 地址为 4555873544

d值为 [1, 2, 3, [4]] 地址为 4556227912

e值为 [1, 2, 3, [4, 5]] 地址为 4556227464

从结果中可以看出来:

b赋值的为a的内存地址,值会随着a的变化而变化---直接赋值,对象引用

c=a.copy()使用的为python自带的copy方法,从结果中可看出复制后c中的父级内容不随着a的变化而变化,但c里面的子list随着a的变化而变化,---浅copy,拷贝父对象,不会拷贝对象的内部的子对象

d和e使用的是python自带的copy模块中的copy方法和deepcopy方法:

其中d的值地址和a不一致,值也不会随着a的变化而变化---深copy,完全拷贝了父对象及其子对象

其中e中父级内容不随着a的变化而变化,但e中子list中内容会随着a的变化而变化---浅copy,拷贝父对象,不会拷贝对象的内部的子对象

print('a子对象值为 {} 地址为 {}'.format(a[3], id(a[3])))

print('e子对象值为 {} 地址为 {}'.format(a[3], id(a[3])))

结果:

a子对象值为 [4, 5] 地址为 4334486344

e子对象值为 [4, 5] 地址为 4334486344

由上可得出,python中的copy分为三种:

1、直接复制:也就是对象引用

2、浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。

3、深拷贝:完全拷贝了父对象及其子对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值