Python 3.x浅拷贝和深拷贝

浅拷贝和深拷贝

变量标签,一个变量可以有一个标签,也可以有多个标签;一个标签可以指向一个数据,也可以指向另一个数据。

所谓深拷贝就是对对象的资源的拷贝
所谓浅拷贝就是对引用的拷贝

Python默认复制对象是浅拷贝,是两个标签指向同一份数据,通过任何一个标签修改数据,都会改变。但如果指向改变其中一个标签的数据,另一个不希望被改变,该怎么做呢?

–浅拷贝


import copy
a=[1,2,3,['a','b','c']]
b=a
c=copy.copy(a)
id(a)
id(b)
id(c)  c是独立的新开辟的地址空间,与a无关系
a.append('d')
b
c		此时修改a对象,c已经不会受影响

下面我们尝试改变深层的子对象,但需要注意一点,修改的子对象必须是可变类型,比如数字,字符串,元组属于不可数据类型。
id(a[3]).append(‘d’)
c[3] 也发生改变了
c
浅拷贝,更深层特点,父对象里面的子对象地址空间竟然是相同的。无论是可变类型子对象,还是不可变类型子对象地址都是相同的,当然指的是copy()操作时已有的对象,如果拷贝后添加新对象,则不受影响。

id(a[0])
id(c[0])
id(a[3])
id(c[3])	

–深拷贝

d=copy.deepcopy(a)
d
a.append('d')
d		使用深拷贝,相当于两个完全独立对象

id(d)
id(a)
对子对象的更改
a[3].append('a3')
d[3].append('d3')
a
d

id(a[3])
id(d[3]) 	//对于可变数据类型的对象,地址已经发生彻底改变
id(a[0])
id(d[0])	//对于不可变数据类型的对象,地址未改变,看似依然像浅拷贝

总结:浅拷贝把父对象拷贝出来,但使用的数据同一地址空间,深拷贝是完全把对象独立出来。但深拷贝浅拷贝,对于不可变数据类型的对象,都只用同一份,一旦使用索引index修改不可变数据类型对象,实际就开辟了新地址空间,贴变量标签

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章