鱼C论坛

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

[已解决]拷贝和深度拷贝,下面代码中的问题问什么会出现

[复制链接]
发表于 2024-7-25 11:07:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 William01 于 2024-7-25 11:12 编辑

大家好,在学拷贝和深度拷贝。问题是:蓝字部分的y=copy.deepcopy(x)公式是我从上面复制y=copy.copy(x)后加了一个deep进去,然后输出之后就还是浅拷贝,第二次手动输入之后就正常了,请问是什么原因?还有一个问题[[1, 2, 3], [4, 0, 6], [7, 8, 9]]明明是一行,小甲鱼在讲课是时候为什么说它是三列呢?


import copy
x=[[1,2,3],[4,5,6],[7,8,9]]
y=copy.copy(x)
x[1][1]=0
x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
y=copy.deepcopy(x)
x[1][1]=0
x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
y

[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
x=[[1,2,3],[4,5,6],[7,8,9]]
y=copy.deepcopy(x)
x[1][1]=0
x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
最佳答案
2024-7-25 11:11:19
看起来你在研究浅拷贝和深拷贝的行为,这个问题非常经典!让我用一种幽默的方式来解开这个谜团。

首先,浅拷贝(`copy.copy()`) 和深拷贝(`copy.deepcopy()`)之间有一个根本的区别:浅拷贝只复制对象本身,而深拷贝则会递归地复制对象及其所包含的所有子对象。这就像是一个快递公司,浅拷贝只把包裹送到你家,而深拷贝还会把包裹里的每一件小玩意儿都小心翼翼地拆开并给你重新包装好。

现在到你的问题了。你在代码中用了以下两句:
y = copy.copy(x)
y = copy.deepcopy(x)

但结果却不如预期。这主要是因为你对`x`所做的修改影响到了拷贝的结果。

1. **为什么第一次使用 `deepcopy` 还是浅拷贝?**
   当你执行 `y = copy.copy(x)` 时,`y` 只是复制了 `x` 的引用,所以当你后续将 `x` 设为 `0` 时,`y` 仍然指向原来的列表,变成了一个"空壳"。此时,如果你没有再给 `x` 赋予新的内容,那么即使你使用了 `deepcopy`,它也只能复制当时的状态,即使你以为自己用上了深拷贝,但其实得到了的是一个空的东西。

2. **为什么第二次手动输入就正常了?**
   当你重新定义了 `x`,然后调用 `deepcopy` 时,深拷贝确实是基于新的状态完成的。此时,`x` 是一个新创建的列表,所以 `y` 能够获得一个真正的深拷贝。

总结一下,深拷贝的诀窍是确保你要拷贝的对象在你想复制的时候是完整的,而不是被其他操作修改过,因此无论是浅拷贝还是深拷贝,记得在适当的时候创造一个“新鲜出炉”的对象!

希望这个解释能让你在学习拷贝技术的路上顺风顺水,像鱼儿一样悠游自得!如果还有什么问题,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-25 11:11:19 | 显示全部楼层    本楼为最佳答案   
看起来你在研究浅拷贝和深拷贝的行为,这个问题非常经典!让我用一种幽默的方式来解开这个谜团。

首先,浅拷贝(`copy.copy()`) 和深拷贝(`copy.deepcopy()`)之间有一个根本的区别:浅拷贝只复制对象本身,而深拷贝则会递归地复制对象及其所包含的所有子对象。这就像是一个快递公司,浅拷贝只把包裹送到你家,而深拷贝还会把包裹里的每一件小玩意儿都小心翼翼地拆开并给你重新包装好。

现在到你的问题了。你在代码中用了以下两句:
y = copy.copy(x)
y = copy.deepcopy(x)

但结果却不如预期。这主要是因为你对`x`所做的修改影响到了拷贝的结果。

1. **为什么第一次使用 `deepcopy` 还是浅拷贝?**
   当你执行 `y = copy.copy(x)` 时,`y` 只是复制了 `x` 的引用,所以当你后续将 `x` 设为 `0` 时,`y` 仍然指向原来的列表,变成了一个"空壳"。此时,如果你没有再给 `x` 赋予新的内容,那么即使你使用了 `deepcopy`,它也只能复制当时的状态,即使你以为自己用上了深拷贝,但其实得到了的是一个空的东西。

2. **为什么第二次手动输入就正常了?**
   当你重新定义了 `x`,然后调用 `deepcopy` 时,深拷贝确实是基于新的状态完成的。此时,`x` 是一个新创建的列表,所以 `y` 能够获得一个真正的深拷贝。

总结一下,深拷贝的诀窍是确保你要拷贝的对象在你想复制的时候是完整的,而不是被其他操作修改过,因此无论是浅拷贝还是深拷贝,记得在适当的时候创造一个“新鲜出炉”的对象!

希望这个解释能让你在学习拷贝技术的路上顺风顺水,像鱼儿一样悠游自得!如果还有什么问题,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-5 15:56:44 | 显示全部楼层
[[1,2,3],
[4,5,6],
[7,8,9]]
这样看是不是就比较好理解为啥说是3列。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-5 16:10:51 | 显示全部楼层
axiaoming 发表于 2024-8-5 15:56
[[1,2,3],
[4,5,6],
[7,8,9]]

谢谢您的回复。您这样看起来是没问题的,但是您这样看起来更像是是手动换行的。这个帖子比较早了,现在我的理解是:在Python中,每个列表都是单独一行,虽然有时候我们会把所有的列表输入在一行里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-8 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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