python基础 -15- 深浅拷贝

浅拷贝
data = {
    "name": "alex",
    "age": 18,
    "scores": {
        "语文": 130,
        "数学": 60,
        "英语": 98,
    }
}

# 浅拷贝
data_copy = data.copy()

# 再看一下各自的内存地址,可以发现指向的内存地址不一样
print("data的内存地址:", id(data), "\tdata_copy的内存地址:", id(data_copy))
print("data的age的内存地址:", id(data["age"]), "\tdata_copy的age的内存地址:", id(data_copy["age"]))
print("data的scores的内存地址:", id(data["scores"]), "\tdata_copy的scores的内存地址:", id(data_copy["scores"]))
print()

# 改变一下data_copy的age值
data_copy["age"] = 20
data_copy["scores"]["语文"] = 140
# 查看各自的数据,可以发现age的值只有data_copy发生改变,字典都发生改变了,因为修改字典内部并不能改变内存的引用地址
print("修改后data数据:%s\ndata_copy数据:%s" % (data, data_copy))
print("修改后data的age的内存地址:", id(data["age"]), "\t修改后data_copy的age的内存地址:", id(data_copy["age"]))
print("修改后data的scores的内存地址:", id(data["scores"]), "\tdata_copy的scores的内存地址:", id(data_copy["scores"]))

 输出

data的内存地址: 2238712599232 	data_copy的内存地址: 2238712642176
data的age的内存地址: 140705936513216 	data_copy的age的内存地址: 140705936513216
data的scores的内存地址: 2238712599168 	data_copy的scores的内存地址: 2238712599168

修改后data数据:{'name': 'alex', 'age': 18, 'scores': {'语文': 140, '数学': 60, '英语': 98}}
data_copy数据:{'name': 'alex', 'age': 20, 'scores': {'语文': 140, '数学': 60, '英语': 98}}
修改后data的age的内存地址: 140705936513216 	修改后data_copy的age的内存地址: 140705936513280
修改后data的scores的内存地址: 2238712599168 	data_copy的scores的内存地址: 2238712599168

 看输出 , 很神奇,两个Dict里age的值是独立的,但score字典里的分数值貌似是共享的

因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份

图中的内存地址和例子中的不一样,懒得画图了。😒

 注意图中2个dict中的name都是alex,内存地址也一样,在没改前,两个name都确实指向同一个内存地址,但只要改任何一个的值,内存地址都会变更, 如age这个key一样。


深拷贝

 若你想彻底使上面的2个dict完全独立,无论有多少层数据。那就要用python工具包里的一个工具了,

import copy

data = {
    "name": "alex",
    "age": 18,
    "scores": {
        "语文": 130,
        "数学": 60,
        "英语": 98,
    }
}

data_copy = copy.deepcopy(data)

# 再看一下各自的内存地址,可以发现指向的内存地址不一样
print("data的内存地址:", id(data), "\ndata_copy的内存地址:", id(data_copy))
print("data的age的内存地址:", id(data["age"]), "\tdata_copy的age的内存地址:", id(data_copy["age"]))
print("data的scores-的内存地址:", id(data["scores"]), "\tdata_copy的scores的内存地址:", id(data_copy["scores"]))
print()

# 改变一下data_copy的age值
data_copy["age"] = 20
data_copy["scores"]["语文"] = 150
# 查看各自的数据,可以发现age和字典的值只有data_copy发生改变,因为是深拷贝,改变字典我的值,相应字典的内存引用也发生改变
print("修改后data数据:%s\n修改后data_copy数据:%s" % (data, data_copy))
print("修改后data的age的内存地址:", id(data["age"]), "\tdata_copy的age的内存地址:", id(data_copy["age"]))
print("修改后data的scores的内存地址:", id(data["scores"]), "\tdata_copy的scores的内存地址:", id(data_copy["scores"]))

 输出

data的内存地址: 2388009767616 
data_copy的内存地址: 2388041388608
data的age的内存地址: 140705936513216 	data_copy的age的内存地址: 140705936513216
data的scores的内存地址: 2388009767552 	data_copy的scores的内存地址: 2388041388352

修改后data数据:{'name': 'alex', 'age': 18, 'scores': {'语文': 140, '数学': 60, '英语': 98}}
修改后data_copy数据:{'name': 'alex', 'age': 20, 'scores': {'语文': 150, '数学': 60, '英语': 98}}
修改后data的age的内存地址: 140705936513216 	data_copy的age的内存地址: 140705936513280
修改后data的scores的内存地址: 2388009767552 	data_copy的scores的内存地址: 2388041388352

 不难看出,在拷贝的时候,就给Dict中的scores分配了一块独立的内存,今后修改的都是独自的内存数据

 最后,这东西有什么用呢? 坦白讲,以后开发中多数情况下你用不到,但是你有要知道有这个知识点,说不定哪天有个需求就要求你必须确保你的2个复制出来的dict,list必须是独立的了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值