python引用和复制一个对象

本文深入探讨了Python中对象引用与复制的区别,通过实例演示了如何使用切片操作符进行浅拷贝,以及如何利用copy模块实现深拷贝,并解释了不同拷贝方式下对象间的影响。
引用和复制一个对象
python 中,"a = b"表示的是对象 a 引用对象 b,对象 a 本身没有单独分配内存空间(重要:
不是复制!),它指向计算机中存储对象 b 的内存。因此,要想将一个对象复制为另一
个对象,不能简单地用等号操作,要使用其它的方法。如序列类的对象是(列表、元组)

要使用切片操作符(即':')来做复制:

"a = b[:]"。[建议学习相关模块:copy]

问题:字符串不是引用: a="tuweizhong";b=a 试试改变 b 的值看看 a 变不变,数组呢?

(字符串不是可变对象在改变时会重新申请内存, id(b)会发生变化)


>>> a=[1,2,3]
>>> b=a
>>> b[0]=5
>>> b
[5, 2, 3]
>>> a
[5, 2, 3]
>>> c=a[:]
>>> c[0]=999
>>> c
[999, 2, 3]
>>> a
[5, 2, 3]
>>> d=[a,c]
>>> d
[[5, 2, 3], [999, 2, 3]]
>>> e=d[:]
>>> e[0][0]=444
>>> d
[[444, 2, 3], [999, 2, 3]]

>>> e
[[444, 2, 3], [999, 2, 3]]
>>> a
[444, 2, 3]
>>> id(a)
33038744
>>> id(b)
33038744
>>>

b = a 其实 b 和 a 是指向同一个内存地址,可以用 id(a)和 id(b)来看是否相同。
c = a[:]是对 a 进行了浅拷贝(与 c = copy.copy(a) 相当),所以改变 c 时发现 a 没有受到影
响, 我们用同样的方式对 d 进行了浅拷贝,发现 e 改变的时候影响到了 a,也就是说浅
拷贝不会拷贝引用中的引用,如果想完全拷贝一份,应该用深拷贝:
import copy
e = copy.deepcopy(d) # 再尝试去改变 e 看看 a 和 c 会不会受到影响(答案是不会)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值