python引用和复制一个对象

来源:互联网 发布:数据挖掘要学哪些东西 编辑:程序博客网 时间:2024/06/05 10:55
引用和复制一个对象
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 会不会受到影响(答案是不会)
0 0