Python全栈之路系列之深浅拷贝

深浅拷贝

深浅拷贝分为两部分,一部分是数字和字符串,另一部分是列表、元组、字典等其他数据类型。

数字和字符串

对于数字字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
# 导入copy模块
>>> import copy
# 定义一个变量var1
>>> var1 = 123
# 输出var1的内存地址
>>> id(var1)
1347747440
>>> var2 = var1
# var2的内存地址和var1相同
>>> id(var2)
1347747440
# 浅拷贝
>>> var3 = copy.copy(var1)
# var3的内存地址和var1相同
>>> id(var3)
1347747440
# 深拷贝
>>> var4 = copy.deepcopy(var1)
# var4的内存地址和var1相同
>>> id(var4)
1347747440

其他数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

创建一个字典var1

var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}

赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
>>> var2 = var1
>>> id(var1)
1937003361288
>>> id(var2)
1937003361288

如图所示:

Python全栈之路系列之深浅拷贝

浅拷贝

浅拷贝,在内存中只额外创建第一层数据

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用浅拷贝的方式
>>> var2 = copy.copy(var1)
# 两个变量的内存地址是不一样的
>>> id(var1)
2084726354952
>>> id(var2)
2084730248008
# 但是他们的元素内存地址是一样的
>>> id(var1["k1"])
2084726207464
>>> id(var2["k1"])
2084726207464

如图所示:

Python全栈之路系列之深浅拷贝

深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

# 导入拷贝模块
>>> import copy
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
# 使用深拷贝的方式把var1的内容拷贝给var2
>>> var2 = copy.deepcopy(var1)
# var1和var2的内存地址是不相同的
>>> id(var1)
1706383946760
>>> id(var2)
1706389852744
# var1和var2的元素"k3"内存地址是不相同的
>>> id(var1["k3"])
1706389853576
>>> id(var2["k3"])
1706389740744
# var1和var2的"k3"元素的内存地址是相同的
>>> id(var1["k3"][1])
1706383265744
>>> id(var2["k3"][1])
1706383265744

如图所示:

[Python全栈之路系列之深浅拷贝

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

上一篇:第三次


下一篇:管道、状态码、循环