python list的引用,浅copy与深copy

基本概念

地址:变量值在计算机内存中存放的位置。

赋值:通常是把对象在计算机内存中存放的位置(地址)赋给变量。

引用

把一个对象在内存中存储的地址赋给不同变量,这些变量指向内存中相同的地址。修改其中任何一个变量的值,就是在修改指定地址存放的对象值,指向同一地址的变量的值跟随改变。

例如:

a=[1,2,3,4]

b=a

修改:a[2]=5

a和b同时改变,都变为[1,2,5,4]

浅copy

把一个变量的值,复制一份,给另一个变量。

非嵌套list

例如:c=[1,2,3,4,5]

d=c.copy() #计算机将c的值复制一份,放在新的内存地址中,将新地址传递给d

变量c,d的值存储在计算机内存的不同位置,修改其中一个不影响另一个变量。

修改: c[2]=5

c变为[1,2,5,4,5],d依然为[1,2,3,4,5]

list嵌套

如e=[1,2,3,[4,5,6]]

那么计算机将[1,2,3,[4,5,6]]存储的起始地址赋给e,这个地址存放了1,2,3

以及[4,5,6]这个嵌套对象在计算机中的存储地址,假定[4,5,6]的存储地址为c234:2345。

e指向的地址存放的值为1,2,3,c234:2345

f=e.copy()

此时将e的值1,2,3,c234:2345,复制一份,放在新的地址,将新的地址传给f。

注意:f的第三个元素(c234:2345),与e的第三个元素值(c234:2345)一样,这个值是一个地址,f[3]与e[3]将访问同一地址(c234:2345)的元素,对f[3]的修改,将导致e[3]同步修改。

例:

f[3][0]=0

f和e都将变为[1,2,3,[0,5,6]]

非嵌套部分的各变量修改独立。

例:

f[0]=9

f变为[9,2,3,[0,5,6]]

e依然为[1,2,3,[0,5,6]]

深copy

深copy的实现

import copy

g=copy.deepcopy(h) #将h深copy给g

深copy与浅copy不同的是,对于嵌套的list也实现值的copy,而不是地址。

例:

h=[1,2,3,[4,5,6]]

同样计算机将[1,2,3,[4,5,6]]存储的起始地址赋给h,这个地址存放了1,2,3

以及[4,5,6]在计算机中的存储地址,假定[4,5,6]的存储地址为c234:5545。

h指向的地址存放的值为1,2,3,c234:5545

g=copy.deepcopy(h) #深copy

将h的值1,2,3复制一份放在新的地址给g,对于嵌套的list[4,5,6],不同于浅copy,也同样将[4,5,6]复制一份放在新的内存位置如:c234:6645

g指向的地址存放的值就为1,2,3,c234:6645

这样对g的修改就不影响e,g,e完全独立

例:

g[3][0]=99

g变为[1,2,3,[99,5,6]]

e依然为[1,2,3,[4,5,6]]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITLiu_JH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值