鱼C论坛

 找回密码
 立即注册
查看: 1531|回复: 3

[已解决]python的浅拷贝和深拷贝问题

[复制链接]
发表于 2018-1-22 23:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼老师在python课后作业的052讲的14题代码如下:

list1 = [1, 2]
list2 = [3, 4]

dict1 = {'1':list1, '2':list2}
dict2 = dict1.copy()

dict1['1'][0] = 5

result = dict1['1'][0] + dict2['1'][0]
print(result)

结果为10,这说明 .copy()复制出的字典是会随着原字典的改动而变化的。

小甲鱼老师在python课后作业的052讲的15题代码如下:

import copy

list1 = [1, 2]
list2 = [3, 4]

dict1 = {'1':list1, '2':list2}
dict2 = copy.deepcopy(dict1)

dict1['1'][0] = 5

result = dict1['1'][0] + dict2['1'][0]
print(result)

结果为6,这说明copy.deepcopy()复制出的字典不会随着原字典的改动而变化。

可是我自己做的一些简单尝试却得到不同的结论:

import copy

dict1 = {'1':'one','2':'two'}
dict2 = dict1.copy()
dict3 = copy.deepcopy(dict1)

dict1['1'] = 'three'
print(dict1['1'],dict2['1'],dict3['1'])

这段代码显示的结果是 three one one
说明这两种复制方法都得到id不同的新字典

小白求助各位大神,不懂为什么结果会不同唔


最佳答案
2018-1-23 09:11:59
copy是可以开辟一块内存空间,但是不能为元素另外开辟
举个例子
a =[1,2]
b= a.copy()
此时ab毫不相干
但是如果
a = [[1,2],3]
b = a.copy()
那么a中第一个元素如果修改,b中第一个元素也跟着修改
要解决这个问题,才需要使用deepcopy
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-22 23:52:18 From FishC Mobile | 显示全部楼层
copy只能复制一层,所以copy过来的[1,2]还是共用一个内存,所以改变后也跟着改变。deepcopy把所有层都拷贝,所以不会改变。你自己的那个例子只有一层,所以不一样,要是字典再嵌套列表就一样了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 09:11:59 | 显示全部楼层    本楼为最佳答案   
copy是可以开辟一块内存空间,但是不能为元素另外开辟
举个例子
a =[1,2]
b= a.copy()
此时ab毫不相干
但是如果
a = [[1,2],3]
b = a.copy()
那么a中第一个元素如果修改,b中第一个元素也跟着修改
要解决这个问题,才需要使用deepcopy
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 12:14:36 | 显示全部楼层
mingminglm 发表于 2018-1-22 23:52
copy只能复制一层,所以copy过来的[1,2]还是共用一个内存,所以改变后也跟着改变。deepcopy把所有层都拷贝 ...

谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-6 04:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表