鱼C论坛

 找回密码
 立即注册
查看: 2557|回复: 11

052作业第14题,copy的字典如何被替换了?

[复制链接]
发表于 2016-8-16 10:03:27 | 显示全部楼层 |阅读模式
5鱼币
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

没看明白原因。

>>> dict1 = {1:2,3:4}
>>> dict2 = {5:6,7:8}
>>> dict1
{1: 2, 3: 4}
>>> dict2
{5: 6, 7: 8}
>>> dict3 = dict2
>>> dict4 = dict2.copy()
>>> dict3
{5: 6, 7: 8}
>>> dict4
{5: 6, 7: 8}
>>> dict2[5] = 60
>>> dict2
{5: 60, 7: 8}
>>> dict3
{5: 60, 7: 8}
>>> dict4
{5: 6, 7: 8}py()


上面这个例子和题目有设么区别呢?

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

使用道具 举报

发表于 2016-8-16 10:14:58 | 显示全部楼层
type(dict1['1'] )

type(dict2[5] )

比较一下异同~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 10:47:46 | 显示全部楼层
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)

因为dict1['1']表示字典dict1里面key值为‘1’的值,即list1,而dict1['1'][0]就表示list1的第0个元素,即1.当dict1['1'][0] = 5表示将列表list1中的1更新为5(list1=[5,2]).dict2是复制的dict1,所以dict2['1'][0]=5,故result=5+5=10(不知道这么理解对不?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 11:13:04 | 显示全部楼层
本帖最后由 玄天宗 于 2016-8-16 11:23 编辑

>>> dict1 = {1:2,3:4}
>>> dict2 = {5:6,7:8}
>>> dict1
{1: 2, 3: 4}
>>> dict2
{5: 6, 7: 8}
>>> dict3 = dict2
>>> dict4 = dict2.copy()
>>> dict3
{5: 6, 7: 8}
>>> dict4
{5: 6, 7: 8}
>>> dict2[5] = 60
>>> dict2
{5: 60, 7: 8}
>>> dict3
{5: 60, 7: 8}
>>> dict4
{5: 6, 7: 8}py()

这个问题你要是看了视频因该就明白了、、、(用小甲鱼视频里说的python里面没有变量只有标签,不知道是不是这么说的
dict2和dict3是将dict2、dict3这两个变量名指向同一字典[5:6,7:8],而dict4是复制dict2(因该是在内存中重新存了一个字典[5:6,7:8])所以当dict2[5]=60时dict2和dict3的值都发生改变而dict4没有变
(可惜不知道怎么上图片)

===两个的区别因该是第一个copy的是一个变量(两个list的值)而第二个copy的就是值
(相互学习,不知道我理解对不??)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-16 13:19:16 | 显示全部楼层
玄天宗 发表于 2016-8-16 11:13
>>> dict1 = {1:2,3:4}
>>> dict2 = {5:6,7:8}
>>> dict1

同样都是copy() 操作

为什么第一个例子中 dict2 随着 dict1 改变了

第二个例子中 dict4 没有随着 dict2 改变呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 14:35:44 | 显示全部楼层
ssg2006 发表于 2016-8-16 13:19
同样都是copy() 操作

为什么第一个例子中 dict2 随着 dict1 改变了

第一个列子你用dict1.setdefault('b',2)这个试试,可以在dict1中加入一个值,dict1={'2': [3, 4], '1': [1, 2], 'b': 2}
你再看dict2的值并没有变、、、、、你对比一下他们有什么不同,因该能明白了、、、

评分

参与人数 1鱼币 +5 收起 理由
ssg2006 + 5

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-8-16 14:50:42 | 显示全部楼层
>>> list1 = [1, 2]
>>> list2 = [3, 4]
>>> dict1 = {'1':list1, '2':list2}
>>> dict2 = dict1.copy()
>>> dict1
{'2': [3, 4], '1': [1, 2]}
>>> dict2
{'2': [3, 4], '1': [1, 2]}
>>> dict1.setdefault('b',2)
2
>>> dict1
{'2': [3, 4], '1': [1, 2], 'b': 2}
>>> dict2
{'2': [3, 4], '1': [1, 2]}
>>> dict1['1'][0] = 5
>>> dict1
{'2': [3, 4], '1': [5, 2], 'b': 2}
>>> dict2
{'2': [3, 4], '1': [5, 2]}
>>> list1
[5, 2]
>>> list2
[3, 4]
>>> dict1['1']
[5, 2]


不知何时直接把 list1 改写了,用 dict1['1'] 可以做到的样子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 15:18:34 | 显示全部楼层
ssg2006 发表于 2016-8-16 14:50
不知何时直接把 list1 改写了,用 dict1['1'] 可以做到的样子。

就是这个dict1['1'][0] = 5 将list1的第一项改成了5  (dict1['1'][0] 分解开就是dict1中key值为‘1’的项,即list1而[0]表示list1的第一项,本来是1,通过dict1['1'][0] = 5就变成5了)
我也是才自学了一部分估计讲得不清楚、、、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-17 18:02:14 | 显示全部楼层
dict1['1']
意思是指list1 = [1, 2]
dict1['1'][0]=5
是指list1 = [5, 2]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-22 16:05:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-8 22:17:58 | 显示全部楼层
度娘和看视频都可以解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-27 00:02:53 | 显示全部楼层
最近刚学到这...
list1 = [1, 2]
list2 = [3, 4]
dict1 = {'1':list1, '2':list2}
dict2 = dict1.copy()            #注意⚠这里虽然是浅拷贝,但是list1是变量,相当于x,变量发生变化,对应的dict1,2,3都会变
dict3=dict1
dict1['1'][0] = 5
print(dict1,dict2,dict3)
result = dict1['1'][0] + dict2['1'][0]
print(result)
print('========================================================')

import copy
list1 = [1, 2]
list2 = [3, 4]
dict1 = {'1':list1, '2':list2}
dict2 = copy.deepcopy(dict1)    #这里是深拷贝,相当于dict2={'1':[1,2, '2':[3,4},已经突破了变量的束缚(固定了)
dict1['1'][0] = 5
result = dict1['1'][0] + dict2['1'][0]
print(result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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