Skip to content

深拷贝浅拷贝

浅拷贝

python
import copy

a = [11, 22, 33]
b = copy.copy(a)

a, b的id是不一样的, 但是里面的数据是一样的

python
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]))
bash
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里面的指针指向的内容是一样的, 只拷贝了最顶层

深拷贝

python
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]))
bash
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

使用这一个拷贝的时候会把这一个数组里面的指向也进行拷贝

切片

使用一个切片进行拷贝的时候实际是一个浅拷贝

python
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]))
python
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

字典的拷贝方法

python
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"]))
bash
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

这也是一个浅拷贝

浅拷贝注意

  • 浅拷贝对于一个可变的类型会进行一个浅拷贝
  • 对于一个不可变的类型只会改变指向
python
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))
bash
PS E:\JHY\python\2024-4-22> python -u "e:\JHY\python\2024-4-22\main.py"
1404091006720 1404090543424
1404090853568 1404090853568

在遇到一个嵌套的数据类型的使用这一个只检测最顶层的那一个是不是可拷贝的类型

实际使用场景

需要使用一个列表又不希望自己的操作影响到原来的列表的时候, 使用可以使用深拷贝(注意这一个列表的大小!!!)