python基础---深拷贝浅拷贝

深拷贝浅拷贝

浅拷贝

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

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

实际使用场景

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

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值