目录
一、概念
1.复制(赋值)
产生原对象的引用,不开辟新的内存空间,使用指针指向原对象,跟原对象完全一样。当对原对象进行操作时,复制对象同样会改变。
2.浅拷贝
将原对象拷贝一份,但是只拷贝原对象表层元素,而对原对象中的子对象没有拷贝,所以当原对象中的子对象发生变化时,浅拷贝后生成的对象也会发生变化。当原对象表层元素改变时,浅拷贝对象不变。
3.深拷贝
将原对象连同其子对象一块进行了拷贝,与原对象已经没有关联,所以深拷贝后的对象不会随着原对象的变化或者子对象的变化而改变。
二、示例
1.不可变对象
import copy #使用copy中方法
a=(1,2,3)
b1=a #复制,结果如下,值与地址相同
b2=copy.copy(a) #浅拷贝,结果如下,值与地址相同
b3=copy.deepcopy(a) #深拷贝,结果如下,值与地址相同
print(a) #(1, 2, 3)
print(id(a)) #2428737531072
print(b1) #(1, 2, 3)
print(id(b1)) #2428737531072
print(b2) #(1, 2, 3)
print(id(b2)) #2428737531072
print(b3) #(1, 2, 3)
print(id(b3)) #2428737531072
#python
值与地址相同:复制、浅拷贝、深拷贝。
2.变量对象
(1)不改变原对象
import copy #使用copy中方法
a=[1,2,3]
b1=a #复制,结果如下,值与地址相同
b2=copy.copy(a) #浅拷贝,结果如下,值相同地址不同
b3=copy.deepcopy(a) #深拷贝,结果如下,值相同地址不同
print(a) #[1, 2, 3]
print(id(a)) #1426627341312
print(b1) #[1, 2, 3]
print(id(b1)) #1426627341312
print(b2) #[1, 2, 3]
print(id(b2)) #1426627342336
print(b3) #[1, 2, 3]
print(id(b3)) #1426627340352
#python
值与地址相同:复制。
值相同地址不同:浅拷贝、深拷贝。
(2)改变原对象外层元素
import copy #使用copy中方法
a=[1,[2,3]]
b1=a #复制,结果如下,值改变
b2=copy.copy(a) #浅拷贝,结果如下,值不变
b3=copy.deepcopy(a) #深拷贝,结果如下,值不变
a.append(4) #外层加入元素“4”
print(a) #[1, [2, 3], 4]
print(b1) #[1, [2, 3], 4]
print(b2) #[1, [2, 3]]
print(b3) #[1, [2, 3]]
#python
值改变:复制。
值不变:浅拷贝、深拷贝。
(3)改变原对象内层元素
import copy #使用copy中方法
a=[1,[2,3]]
b1=a #复制,结果如下,值改变
b2=copy.copy(a) #浅拷贝,结果如下,值改变
b3=copy.deepcopy(a) #深拷贝,结果如下,值不变
a[1].append(4) #内层加入元素“4”
print(a) #[[1, [2, 3, 4]]
print(b1) #[[1, [2, 3, 4]]
print(b2) #[[1, [2, 3, 4]]
print(b3) #[1, [2, 3]]
#python
值改变:复制、浅拷贝。
值不变:深拷贝。
2022.11.02
初稿