最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Python深浅拷贝的理解

来源:博客园


【资料图】

1.拷贝

拷贝实际上其实就是在赋值,比如我们有一个列表L1,定义另一个列表L2引用列表L1,实际上就是在拷贝列表L1的值,由于由于L1列表是可变的数据类型,所以当L1的值变的时候,L2的值也是在跟着变的.那其实就算L1内的是不可变的数据类型,L1的内容变化,L2的内容也一样会随之变化的

# # 拷贝(赋值)# Python学习交流QQ群:153708845lt = [1, 2, 3]lt2 = ltlt.append(4)print(lt)# [1, 2, 3, 4]# 因为列表是可变类型,所以lt的值变化,lt2的值也会跟着变化print(lt2)# [1, 2, 3, 4]

2.浅拷贝

浅拷贝时,我们时需要在写代码前import.copy,导入copy的方法,其实列表在内存空间里是以索引的形式存在的,索引指向的才是对应的具体的值,那当我们用L2去copy列表L1的时候,那他们两个列表的索引只想的值都是一样的,如果L1的某一索引对应的值有变化的时候,L2这个列表是否变化是取决于L1列表变化的那个索引的值是否为可变化数据类型。也就是说当L1列表内的数据是可变化类型的化,L2会随之变化:L1列表内的数据是不可变的数据类型,那L2列表的数据则不会跟着变化。

# 浅拷贝# copy.copy()import copyl1 = ["xichen","nick","egon",["rockey","pilipili"]]l2 = copy.copy(l1)l1.append("xuchen")print(l1)# ["xichen", "nick", "egon", ["rockey", "pilipili"], "xuchen"] print(l2)# ["xichen", "nick", "egon", ["rockey", "pilipili"]]l1[-1].append("xucheng")print(l1)# ["xichen", "nick", "egon", ["rockey", "pilipili", "xucheng"]]print(l2)# ["xichen", "nick", "egon", ["rockey", "pilipili", "xucheng"]]

3.深拷贝

深拷贝和浅拷贝一样,在写代码之前需要import.copy导入copy的方法,但是我们深拷贝的时候用的是deepcopy,其他的语法和浅拷贝是一样的,但是深拷贝和浅拷贝不一样的是,深拷贝不管列表L1里面的内容是可变还是不可变的,当L1变化的时候,L2列表里面的数据都不会改变的

import copylt = [1000, 2000, 3000, [4000, 5000, 6000]]print("id(lt)",id(lt))print("id(lt[0])", id(lt[0]))print("id(lt[1])", id(lt[1]))print("id(lt[2])", id(lt[2]))print("id(lt[3])", id(lt[3]))print("*" * 50)# id(lt) 2608713900296# id(lt[0]) 2608710450544# id(lt[1]) 2608593350352# id(lt[2]) 2608594909872# id(lt[3]) 2608713954696**************************************************lt2 = copy.deepcopy(lt)print("id(lt2)",id(lt2))print("id(lt2[0])", id(lt2[0]))print("id(lt2[1])", id(lt2[1]))print("id(lt2[2])", id(lt2[2]))print("id(lt2[3])", id(lt2[3]))print("*" * 50)# id(lt2) 2608713900616# id(lt2[0]) 2608710450544# id(lt2[1]) 2608593350352# id(lt2[2]) 2608594909872# id(lt2[3]) 2608713900744**************************************************

总结:

  • 牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型
  • 拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值
  • 浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化copy.copy() 可变数据的类型中的内置方法.copy()
  • 深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变copy.deepcopy()

关键词: 数据类型 可变数据 都是一样的