深拷贝浅拷贝
浅拷贝
import copy
a = [11, 22, 33]
b = copy.copy(a)
a, b的id是不一样的, 但是里面的数据是一样的
import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.copy(c)
print(c)
print(d)
print(id(c[0]))
print(id(d[0]))
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" [[11, 22], [33, 44]] [[11, 22], [33, 44]] 2125479968320 2125479968320
使用这一个拷贝的时候c和d里面的指针指向的内容是一样的, 只拷贝了最顶层
深拷贝
import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.deepcopy(c)
print(c)
print(d)
print(id(c[0]))
print(id(d[0]))
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" [[11, 22], [33, 44]] [[11, 22], [33, 44]] 2009340411520 2009339899072
使用这一个拷贝的时候会把这一个数组里面的指向也进行拷贝
切片
使用一个切片进行拷贝的时候实际是一个浅拷贝
import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = c[:]
print(c)
print(d)
print(id(c))
print(id(d))
print(id(c[0]))
print(id(d[0]))
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" [[11, 22], [33, 44]] [[11, 22], [33, 44]] 2837900324224 2837900323328 2837900787264 2837900787264
字典的拷贝方法
a = {
"name": "jiao",
"age": 18,
"cars" : ["BMW", "Audi", "Benz"]
}
b = a.copy()
print(id(a))
print(id(b))
print(a)
print(b)
print(id(a["cars"]))
print(id(b["cars"]))
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" 1603023712768 1603023713024 {'name': 'jiao', 'age': 18, 'cars': ['BMW', 'Audi', 'Benz']} {'name': 'jiao', 'age': 18, 'cars': ['BMW', 'Audi', 'Benz']} 1603023806720 1603023806720
这也是一个浅拷贝
浅拷贝注意
- 浅拷贝对于一个可变的类型会进行一个浅拷贝
- 对于一个不可变的类型只会改变指向
import copy
a = [11, 22, 33]
b = (11, 22, 33)
c = copy.copy(a)
d = copy.copy(b)
print(id(a), id(c))
print(id(b), id(d))
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py" 1404091006720 1404090543424 1404090853568 1404090853568
在遇到一个嵌套的数据类型的使用这一个只检测最顶层的那一个是不是可拷贝的类型
实际使用场景
需要使用一个列表又不希望自己的操作影响到原来的列表的时候, 使用可以使用深拷贝(注意这一个列表的大小!!!)