|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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]]
看起来你在研究浅拷贝和深拷贝的行为,这个问题非常经典!让我用一种幽默的方式来解开这个谜团。
首先,浅拷贝(`copy.copy()`) 和深拷贝(`copy.deepcopy()`)之间有一个根本的区别:浅拷贝只复制对象本身,而深拷贝则会递归地复制对象及其所包含的所有子对象。这就像是一个快递公司,浅拷贝只把包裹送到你家,而深拷贝还会把包裹里的每一件小玩意儿都小心翼翼地拆开并给你重新包装好。
现在到你的问题了。你在代码中用了以下两句:
和
但结果却不如预期。这主要是因为你对`x`所做的修改影响到了拷贝的结果。
1. **为什么第一次使用 `deepcopy` 还是浅拷贝?**
当你执行 `y = copy.copy(x)` 时,`y` 只是复制了 `x` 的引用,所以当你后续将 `x` 设为 `0` 时,`y` 仍然指向原来的列表,变成了一个"空壳"。此时,如果你没有再给 `x` 赋予新的内容,那么即使你使用了 `deepcopy`,它也只能复制当时的状态,即使你以为自己用上了深拷贝,但其实得到了的是一个空的东西。
2. **为什么第二次手动输入就正常了?**
当你重新定义了 `x`,然后调用 `deepcopy` 时,深拷贝确实是基于新的状态完成的。此时,`x` 是一个新创建的列表,所以 `y` 能够获得一个真正的深拷贝。
总结一下,深拷贝的诀窍是确保你要拷贝的对象在你想复制的时候是完整的,而不是被其他操作修改过,因此无论是浅拷贝还是深拷贝,记得在适当的时候创造一个“新鲜出炉”的对象!
希望这个解释能让你在学习拷贝技术的路上顺风顺水,像鱼儿一样悠游自得!如果还有什么问题,随时问我哦!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|