画个圈圈XZQ 发表于 2021-3-24 20:39:21

将字典作为值添加进另一个字典中,没有明显的修改,为什么ta会变

本帖最后由 画个圈圈XZQ 于 2021-3-24 20:47 编辑

dict1 = {}
dict2 = {}
a = 0
b = 2
c = "A"

while b:
    dict1 = input("输入dict的值:")
    dict2 = dict1
    print(dict2,dict1)
    a = 1
    c = "B"
    b -= 1

运行结果如下:

输入dict1的值:a
{'A': {0: 'a'}} {0: 'a'}
输入dict1的值:b
{'A': {0: 'a', 1: 'b'}, 'B': {0: 'a', 1: 'b'}} {0: 'a', 1: 'b'}



第一次循环字典dict4中的键"A"的值为{0 : "a"},第二次循环后键"A"的值又变成了{0 :"a" , 1 : "b"},
将dict1换成列表的形式也是一样,试了下把 dict1 = {} 放在循环初始位置键"A"的值就不会变。

为什么像上面那样ta的值会变成下一次循环键的值

代码小白liu 发表于 2021-3-24 21:28:16

本帖最后由 代码小白liu 于 2021-3-24 21:29 编辑

while 2    输入dict1的值:a   这时候就按照循环要求,第一次打印dict2{},dict1{},因为原始都是空,所以dcit1{0:“a”},dict2{"A":dict1{}},也就是{'A': {0: 'a'}},【注意此时print下边的还未运行
然后继续循环,此时 a = 1 c = "B"b -= 1正常运行    判断while 1 ,然后输入输入   dict1的值:b   也就是{1:"b"} 加入到上次一的dict1中,就是{0: 'a', 1: 'b'},然后再看dict2,就是{"B":dict1}一次循环时dict2 已经等于{'A': {0: 'a'}},所以此时应该等于,{{"A":dict1}{"B":dict1}}    也就是{'A': {0: 'a', 1: 'b'}, 'B': {0: 'a', 1: 'b'}}          然后 dict2 ={'A': {0: 'a', 1: 'b'}, 'B': {0: 'a', 1: 'b'}}   dict1 = {0: 'a', 1: 'b'}
就是最终的结果

代码小白liu 发表于 2021-3-24 21:32:07

dict1 = {} 放在循环初始位置的话,每次循环dict1 都会为空啊   你放在外边, 第二次循环的时候,此时dict1 已经有值了不是空

画个圈圈XZQ 发表于 2021-3-25 09:08:58

代码小白liu 发表于 2021-3-24 21:28
while 2    输入dict1的值:a   这时候就按照循环要求,第一次打印dict2{},dict1{},因为原始都是空, ...

第五行我的理解是dict2{ "A":{0:"a"} , "B":dict1{} },我觉得第一次循环时 dict1 的值 {0:"a"} 已经给了键 "A" ,
下一次循环键 "A" 的值不应该随着 dict1 的值而改变,,,,走进误区了.

画个圈圈XZQ 发表于 2021-3-25 09:28:03

本帖最后由 画个圈圈XZQ 于 2021-3-25 09:52 编辑

在循环末尾加了 dict1.clear() 用来清空 dict1 ,清空后键 "A"的值也跟着变成了 { } ,应该是只是单纯的修改 dict1 的值,那么ta之前作为键 "A" 的值也会变成修改后的值,
如果是将 dict1 这个标签重新贴向值 { } ,那么ta之前的值 {0:"a"} 作为键 "A" 的值就不会变.

代码小白liu 发表于 2021-3-25 15:00:29

画个圈圈XZQ 发表于 2021-3-25 09:28
在循环末尾加了 dict1.clear() 用来清空 dict1 ,清空后键 "A"的值也跟着变成了 { } ,应该是只是单纯的修 ...

有用的话来个最佳答案?

画个圈圈XZQ 发表于 2021-3-26 20:11:28

代码小白liu 发表于 2021-3-25 15:00
有用的话来个最佳答案?

老哥,不好意思哈,最近没怎么看帖子
页: [1]
查看完整版本: 将字典作为值添加进另一个字典中,没有明显的修改,为什么ta会变