当前位置:网站首页>浅拷贝与深拷贝
浅拷贝与深拷贝
2022-07-16 20:31:00 【NeilNiu】
一、 浅拷贝,只会对可变类型的第一层对象进行拷贝,不会对子对象进行拷贝,拷贝成功后会开辟一个新的内存空间存储拷贝这个对象
1、不可变类型:数字、字符串、元组
copy()表示是一个浅拷贝函数
import copy
num1 = 1
num2 = copy.copy(num1)
# 查看内存地址没有发生变化,说明没有对对象进行拷贝,也就说没有开辟新的内存空间
print("num1:", id(num1), "num2:", id(num2))
my_tuple1 = (3, 5)
my_tuple2 = copy.copy(my_tuple1)
print("my_tuple1:", id(my_tuple1), "my_tuple2:", id(my_tuple2))
# 输出
# num1: 8791254989888 num2: 8791254989888
# my_tuple1: 31363016 my_tuple2: 31363016总结:浅拷贝不会对不可变类型进行拷贝,也就是说不会开辟内存空间。
对于不可变类型进行浅拷贝实际上是对引用的一个拷贝,两个变量指向的是同一个内存地址,没有开辟新的地址。
2、可变类型: 列表 、字典、 集合
# 可变类型: 列表 、字典、集合
my_list1 = [1, 3, [4, 6]]
my_list2 = copy.copy(my_list1)
print("my_list1:", id(my_list1), "my_list2:", id(my_list2))
my_list1.append(5)
print(my_list1, my_list2)
print("my_list1[2]", id(my_list1[2]), "my_list2[2]:", id(my_list2[2]))
# 输出
# my_list1: 35415880 my_list2: 35416200
# [1, 3, [4, 6], 5] [1, 3, [4, 6]]
# my_list1[2] 35415816 my_list2[2]: 35415816对于可变类型来说,浅拷贝只拷贝第一次层,不会对子对象进行拷贝,所以第一层内存地址发生了变化,但是子对象内存地址没有变化。
二、深拷贝
deepcopy函数是深拷贝,只要发现对象有可变类型,就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储
1、不可变类型: 数字、字符串、元组
对于数字和字符串,都是不可变类型,所以使用深拷贝的时候,不会开辟新的内存空间。
元组中如果有可变类型对象,进行深拷贝后,会开辟新的内存地址。元组中如果没有可变类型对象,进行深拷贝后,不会开辟新的内存地址。
import copy
num1 = 1
num2 = copy.deepcopy(num1)
print("num1:", id(num1), "num2:", id(num2))
str1 = 'hello'
str2 = copy.deepcopy(str1)
print("str1:", id(str1), "str2:", id(str2))
my_tuple1 = (1, 2)
my_tuple2 = copy.deepcopy(my_tuple1)
print("my_tuple1:", id(my_tuple1), "my_tuple2:", id(my_tuple2))
my_tuple3 = (1, [1, 2])
my_tuple4 = copy.deepcopy(my_tuple3)
print("my_tuple3:", id(my_tuple3), "my_tuple4:", id(my_tuple4))
# 输出
# num1: 8791250992192 num2: 8791250992192
# str1: 35017200 str2: 35017200
# my_tuple1: 34967496 my_tuple2: 34967496
# my_tuple3: 35475400 my_tuple4: 35350920
总结:如果发现元组里面有可变类型那么,会对元组进行拷贝和子元素列表进行拷贝,拷贝后都会产生一个新的内存空间。但是不可变类型不会进行拷贝,因为不可变类型不允许在原有内存空间的基础修改数据。所以拷贝没有意义。因为每次拷贝,内存地址都会发生变化。
2、可变类型: 列表 、 字典、 集合
对应深拷贝来说也会进行拷贝,如果发现子对象也是可变类型也会进行拷贝,拷贝后会开辟新的内存空间存储拷贝后的对象。
my_list1 = [1, [2, 3]]
my_list2 = copy.deepcopy(my_list1)
print("my_list1:", id(my_list1), "my_list2:", id(my_list2))
print("my_list1[0]:", id(my_list1[0]), "my_list2[0]:", id(my_list2[0]))
print("my_list1[1]:", id(my_list1[1]), "my_list2[1]:", id(my_list2[1]))
# 输出
# my_list1: 31877064 my_list2: 31877384
# my_list1[0]: 8791250992192 my_list2[0]: 8791250992192
# my_list1[1]: 31877000 my_list2[1]: 31884040无论是浅拷贝还是深拷贝,都是对可变类型进行拷贝的,开辟新的内存空间。
三、浅拷贝和深拷贝的区别
浅拷贝最多拷贝对象的一层
深拷贝可能是拷贝对象的多层
四、总结
浅拷贝使用copy.copy()函数
深拷贝使用copy.deepcopy()函数
不管是给对象进行深拷贝还是浅拷贝,只要拷贝成功就会开辟新的内存空间存储拷贝对象。
浅拷贝和深拷贝的区别:浅拷贝最多拷贝对象的一层,深拷贝可能拷贝对象的多层
边栏推荐
- Leetcode45. Jumping game II
- How to solve the problem of 8080 port being occupied? Win11 8080 port occupied solution
- The observation returned by the 'reset()' method is not contained with the
- Mapbox GL loading 3dfiles gradient model (video)
- 2022.7.14-----leetcode. seven hundred and forty-five
- [applet project development -- JD mall] product list page of uni app (Part 1)
- 语音转换主要涉及技术记录
- How to take long screenshots in win11? Win11 long screenshot method
- Three sides of headlines + four sides of Alibaba + five sides of Tencent took the offer to share the summary, and finally joined Alibaba
- The 100 billion yuan universe market is the new driving force of soul and Yingke
猜你喜欢

Developers share the initial experience of tinyms, a high-level API tool of mindspire!

How to record sound on win11 screen? Win11 method of recording screen video with sound

A New Optimizer Using Particle Swarm Theory

创新中心首发!恭喜佳华物链云获MindSpore认证!

原装rexroth比例阀4WRBA10W64-2X/G24N9Z4/M

数据库常遇到的问题

Arduino窗口乱码问题

Transfer function

uniapp基础知识

TCP congestion control details | 6 Active queue management
随机推荐
程序员成长第二十篇:刚晋升管理者,有哪些方面要注意?
解题-->在线OJ(十六)
Leetcode 47. Full arrangement II
Source code analysis of ArrayList
Remember once, ants were abused on all sides. The water was too deep. Have you built the ferry across the river?
语音转换历史调研记录
远程购买商品Solidity合约
2-conan 二进制包依赖管理方案
alicloud3搭建wordpress
Open source ten questions, a quick start guide for community newcomers
1、shell-echo > 和 echo>>
技術幹貨| MindSpore新一代自主研發分子模擬庫:Mind-Sponge
2-conan 二進制包依賴管理方案
Alicloud3 build WordPress
2022.7.15-----leetcode. five hundred and fifty-eight
技术干货 | 模型优化精度、速度我全都要!MindSpore模型精度调优实战(二)
[advanced C language] ⑨ dynamic memory allocation knowledge summary is super detailed
416.分割等和子集·背包问题·动态规划
Topic selection recommendation of the latest information security graduation project
LCD 显示撕裂解决