舍侠 发表于 2022-4-29 11:07:21

38讲习题1和2

1>>> d = {"小甲鱼":"千年王八,万年龟。"}
>>> e = d.copy()
>>> d["小甲鱼"] = "666"
求e变量
2>>> d = {"小甲鱼":{"数学":99, "英语":88, "语文":101}}
>>> e = d.copy()
>>> d["小甲鱼"]["语文"] = 100
求e变量
为什么习题1的变量没有变化,而习题2的e变量值发生了变化了呢

isdkz 发表于 2022-4-29 11:10:52

copy() 是浅拷贝,它只是复制了最外层的值,里层的引用还是不变,

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

所以修改 d 的里层字典会影响到 e 的

舍侠 发表于 2022-4-29 11:11:54

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

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

习题1里面的e变量没有变啊

Twilight6 发表于 2022-4-29 11:13:29


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

https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=172817&pid=4777529

isdkz 发表于 2022-4-29 11:14:41

舍侠 发表于 2022-4-29 11:11
习题1里面的e变量没有变啊

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

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

d["小甲鱼"] 和 d["小甲鱼"]["语文"] 一个一层一个两层能一样吗?

舍侠 发表于 2022-4-29 11:29:57

isdkz 发表于 2022-4-29 11:14
因为习题 1 使用的是字符串呀,字符串是不可变对象,

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


一层不变,二层可以变??

isdkz 发表于 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}}
>>>

舍侠 发表于 2022-4-29 11:47:48

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

你使用 ...

刚学了就忘,唉,这个编程太难了

isdkz 发表于 2022-4-29 11:52:16

舍侠 发表于 2022-4-29 11:47
刚学了就忘,唉,这个编程太难了

慢慢来嘛{:5_108:}
页: [1]
查看完整版本: 38讲习题1和2