想骑鹰的蜗牛 发表于 2024-3-17 21:02:38

新手入门,字典覆盖问题

请教大佬,为什么第二个字典的数据会覆盖第一个字典的数据呢?



list_init = []
hobby01 = {}
num = 0
while True:
    name = input("请输入姓名:")
    if name == "":
      break
    while True:
      num += 1
      hobby_num = input("请输入第"+ str(num) +"个爱好:")
      if hobby_num == "":
            num = 0
            break
      hobby01["第"+ str(num) +"爱好"] = hobby_num
    hobby = {name: hobby01}
    list_init.append(hobby)
print(list_init)

FishC 发表于 2024-3-17 21:02:55

你好!在这段代码中,第二个字典的数据会覆盖第一个字典的数据是因为在循环中,你重复使用了同一个变量`hobby01`来存储爱好。由于字典是可变对象,在循环中多次使用同一个变量时,实际上是将相同的字典对象赋值给了不同的键。

解决此问题有两种方法:

方法一:在每次循环开始前,重新创建一个空字典来存储当前姓名对应的爱好,然后再将该字典添加到列表中。代码如下:

list_init = []
while True:
    name = input("请输入姓名:")
    if name == "":
      break
    hobby_dict = {}# 创建一个空字典来存储爱好
    num = 0# 每次循环重新计数
    while True:
      num += 1
      hobby_num = input("请输入第"+ str(num) +"个爱好:")
      if hobby_num == "":
            break
      hobby_dict = hobby_num# 将爱好添加到字典中,键为序号
    list_init.append({name: hobby_dict})# 将当前姓名和对应的爱好字典添加到列表中
print(list_init)

方法二:在每次循环开始前,创建一个空列表来存储当前姓名对应的爱好,然后再将该列表作为值添加到字典中。代码如下:

list_init = []
while True:
    name = input("请输入姓名:")
    if name == "":
      break
    hobby_list = []# 创建一个空列表来存储爱好
    num = 0# 每次循环重新计数
    while True:
      num += 1
      hobby_num = input("请输入第"+ str(num) +"个爱好:")
      if hobby_num == "":
            break
      hobby_list.append(hobby_num)# 将爱好添加到列表中
    list_init.append({name: hobby_list})# 将当前姓名和对应的爱好列表字典添加到列表中
print(list_init)

希望对你有所帮助!如还有疑问,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 新手入门,字典覆盖问题