鱼C论坛

 找回密码
 立即注册
查看: 1754|回复: 2

[已解决]课后选择题求解

[复制链接]
发表于 2020-11-16 22:42:14 | 显示全部楼层 |阅读模式

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

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

x
代码A;
dict1 = {}
dict1[1] = 1
dict1['1'] = 2
dict1[1.0] = 3

result = 0
for each in dict1:
    result += dict1[each]

print(result)
5
为什么会得到5?而不始6

--------------------------------分割线---------------------------------------------------
代码B:
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
为什么会得到10
--------------------------------分割线-----------------------------------------
代码C:
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
最佳答案
2020-11-16 23:15:40
为什么会得到5?而不始6
--因为作为字典的键,1.0和1是同一的,dict1[1.0] = 3把dict1[1] = 1覆盖了。
为什么会得到10
--copy是浅拷贝,dict1的list1和list2,与dict2的共用同一地址,其中一个改变了,另一个也同步改变
为什么等于 6
--deepcopy是深拷贝,dict1的list1和list2,与dict2的地址不同,其中一个改变了,另一个不会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-16 23:15:40 | 显示全部楼层    本楼为最佳答案   
为什么会得到5?而不始6
--因为作为字典的键,1.0和1是同一的,dict1[1.0] = 3把dict1[1] = 1覆盖了。
为什么会得到10
--copy是浅拷贝,dict1的list1和list2,与dict2的共用同一地址,其中一个改变了,另一个也同步改变
为什么等于 6
--deepcopy是深拷贝,dict1的list1和list2,与dict2的地址不同,其中一个改变了,另一个不会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 09:49:09 | 显示全部楼层
===为什么会得到5?而不始6
字典键值如果是数字,它就是一个float型,而且精度不好说,请看实例:
>>> a={1:'one',1.0:'two',1.00000000000000000000001:'three'}
>>> a            
{1: 'three'}         #很神奇吧,它只剩1对了。。。
--------------------------------分割线---------------------------------------------------
====为什么会得到10
dict.copy()返回的是一个浅复制,何谓浅复制,请看实例:

>>> dict1 = {1:'root',2:[1,2,3]}
>>> dict2 = dict1
>>> dict3 = dict1.copy()
>>> dict1[1] = 'fuck'
>>> dict1
{1: 'fuck', 2: [1, 2, 3]}     
>>> dict2
{1: 'fuck', 2: [1, 2, 3]}
>>> dict3
{1: 'root', 2: [1, 2, 3]}           #到这里可以看出来,dict.copy()浅复制,必然复制了父对象
>>> dict1[2].reverse()
>>> dict1
{1: 'fuck', 2: [3, 2, 1]}
>>> dict2
{1: 'fuck', 2: [3, 2, 1]}
>>> dict3
{1: 'root', 2: [3, 2, 1]}          #到这里可以看出来,dict.copy()浅复制,对子对象仅仅是引用

也就是说dict1 = {1:'root',2:[1,2,3]},dict1.copy(),拷贝了1:'root',以及2,对子对象[1,2,3]则为引用,而不是直接拷贝。看例子:

>>> dict1={1:'123',2:[456]}
>>> dict2=dict1.copy()
>>> dict1[1]='111'
>>> dict1[2].reverse()
>>> id(dict1[1])
64516896
>>> id(dict2[1])
64516640
>>> id(dict1[2])
64452648
>>> id(dict2[2])
64452648

--------------------------------分割线-----------------------------------------
深拷贝就是完全拷贝了,这里就不啰嗦了,可以用第2个方法,自己写个例子用id()查看变量的内存地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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