深拷贝 浅拷贝 copy

1 篇文章 0 订阅
1 篇文章 0 订阅

深拷贝、浅拷贝、copy、deepcopy

针对于深拷贝和浅拷贝的问题,做了一下实验帮助理解

代码

import copy

s1 = [11, 22]
s2 = [33, 44]

a = [11, 22]
print(r'赋值符号在python里面是‘指向’的意思,共用同一个内存地址')
a = s1
print('{}: {},id: {}'.format('a', a, id(a)))
print(r'浅拷贝只是拷贝了最外层的东西,所以地址发送变化')
b = copy.copy(a)
print('{}: {},id: {}'.format('b', b, id(b)))
print(r'深拷贝是从头到尾全部拷贝,所有的地址均发生变化')
c = copy.deepcopy(a)
print('{}: {},id: {}'.format('c', c, id(c)))

print('\n\n')
print(r'列表指向的情况下,可以看出深拷贝和浅拷贝的区别')
s12 = [s1, s2]
print('{}: {},id: {}'.format('s12', s12, id(s12)))
bb = copy.copy(s12)
cc = copy.deepcopy(s12)
print('{}: {},id: {}'.format('bb', bb, id(bb)))
print('{}: {},id: {}'.format('cc', cc, id(cc)))
print('{}: {},id: {}'.format('bb[0]', bb[0], id(bb[0])))
print('{}: {},id: {}'.format('cc[0]', cc[0], id(cc[0])))

print('\n\n')
print(r'注意(坑):')
print(r'元组元素为常量时,浅/深拷贝无效;元组元素为变量/地址时,深拷贝有效')
ss_tuplt = (11, 22)
d = copy.copy(ss_tuplt)
e = copy.deepcopy(ss_tuplt)
print('{}: {},id: {}'.format('d', d, id(d)))
print('{}: {},id: {}'.format('e', e, id(e)))
ss_tuplt = (s1, s2)
d = copy.copy(ss_tuplt)
e = copy.deepcopy(ss_tuplt)
print('{}: {},id: {}'.format('d', d, id(d)))
print('{}: {},id: {}'.format('e', e, id(e)))
print(r'切片相当于浅拷贝')
s1 = [1, 2, 3, 4]
s2 = s1[:]
print('{}: {},id: {}'.format('s1', s1, id(s1)))
print('{}: {},id: {}'.format('s2', s2, id(s2)))
print('{}: {},id: {}'.format('s1[0]', s1[0], id(s1[0])))
print('{}: {},id: {}'.format('s2[0]', s2[0], id(s2[0])))

运行截图

在这里插入图片描述

结论

在更改值的时候需要考虑是否会影响同样指向该地址的变量(浅拷贝);
在做测验的时候需要考虑是否会污染数据源(深拷贝)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值