鱼C论坛

 找回密码
 立即注册
查看: 3222|回复: 8

[已解决]38讲习题1和2

[复制链接]
发表于 2022-4-29 11:07:21 | 显示全部楼层 |阅读模式

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

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

x
1>>> d = {"小甲鱼":"千年王八,万年龟。"}
>>> e = d.copy()
>>> d["小甲鱼"] = "666"
求e变量
2>>> d = {"小甲鱼":{"数学":99, "英语":88, "语文":101}}
>>> e = d.copy()
>>> d["小甲鱼"]["语文"] = 100
求e变量
为什么习题1的变量没有变化,而习题2的e变量值发生了变化了呢
最佳答案
2022-4-29 11:32:48
舍侠 发表于 2022-4-29 11:29
一层不变,二层可以变??

不是,因为 copy 是只复制了一层,而它第二层是可变对象的话,所有指向它的引用都是会跟着变的

你使用 深拷贝的话就不会出现这种问题:

>>> from copy import deepcopy
>>> d = {"小甲鱼":{"数学":99, "英语":88, "语文":101}}
>>> e = deepcopy(d)
>>> d["小甲鱼"]["语文"] = 100
>>> d
{'小甲鱼': {'数学': 99, '英语': 88, '语文': 100}}
>>> e
{'小甲鱼': {'数学': 99, '英语': 88, '语文': 101}}
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-29 11:10:52 | 显示全部楼层
copy() 是浅拷贝,它只是复制了最外层的值,里层的引用还是不变,

所以 d 跟 e 的 '小甲鱼' 的值还是使用了同一个字典,因为字典是可变对象,

所以修改 d 的里层字典会影响到 e 的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-29 11:11:54 | 显示全部楼层
isdkz 发表于 2022-4-29 11:10
copy() 是浅拷贝,它只是复制了最外层的值,里层的引用还是不变,

所以 d 跟 e 的 '小甲鱼' 的值还是使 ...

习题1里面的e变量没有变啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 11:13:29 | 显示全部楼层

看看这篇文章是否对有所帮助:

https://fishc.com.cn/forum.php?m ... 817&pid=4777529

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

使用道具 举报

发表于 2022-4-29 11:14:41 | 显示全部楼层
舍侠 发表于 2022-4-29 11:11
习题1里面的e变量没有变啊

因为习题 1 使用的是字符串呀,字符串是不可变对象,

而且你是直接对 '小甲鱼' 这个键赋值,

d["小甲鱼"] 和 d["小甲鱼"]["语文"] 一个一层一个两层能一样吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-29 11:29:57 | 显示全部楼层
isdkz 发表于 2022-4-29 11:14
因为习题 1 使用的是字符串呀,字符串是不可变对象,

而且你是直接对 '小甲鱼' 这个键赋值,

一层不变,二层可以变??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 11:32:48 | 显示全部楼层    本楼为最佳答案   
舍侠 发表于 2022-4-29 11:29
一层不变,二层可以变??

不是,因为 copy 是只复制了一层,而它第二层是可变对象的话,所有指向它的引用都是会跟着变的

你使用 深拷贝的话就不会出现这种问题:

>>> from copy import deepcopy
>>> d = {"小甲鱼":{"数学":99, "英语":88, "语文":101}}
>>> e = deepcopy(d)
>>> d["小甲鱼"]["语文"] = 100
>>> d
{'小甲鱼': {'数学': 99, '英语': 88, '语文': 100}}
>>> e
{'小甲鱼': {'数学': 99, '英语': 88, '语文': 101}}
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-29 11:47:48 | 显示全部楼层
isdkz 发表于 2022-4-29 11:32
不是,因为 copy 是只复制了一层,而它第二层是可变对象的话,所有指向它的引用都是会跟着变的

你使用 ...

刚学了就忘,唉,这个编程太难了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 11:52:16 | 显示全部楼层
舍侠 发表于 2022-4-29 11:47
刚学了就忘,唉,这个编程太难了

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 10:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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