Python循环向字典添加字符串时子字典值被覆盖问题求解
问题原因
Python中字典属于可变对象,直接赋值时传递的是对象的内存引用,而非独立的内容副本。
你的代码在循环外仅初始化了1个subdict实例,整个循环过程中对subdict的修改、以及赋值给maindict不同键的操作,本质都是在操作同一个内存地址的字典对象。因此第二次循环修改subdict内容时,第一次存入maindict的条目因为指向同一个对象,值会同步被覆盖。哪怕你按原计划在赋值后调用subdict.clear()清空子字典,已经存入主字典的所有条目也会同步被清空,问题本质完全一致。
正确实现方案
写法1:每次循环新建独立子字典(推荐)
不需要提前在循环外定义子字典,每次录入时直接生成全新的子字典赋值给对应key,从根源上避免引用复用问题,代码最简洁不易出错:
maindict = {} while True: username = input("Enter username: ") # 增加退出逻辑:输入空用户名时终止录入,避免死循环 if not username: break password = input("Enter password: ") # 每次循环创建全新的子字典实例,不同key对应完全独立的子字典对象 maindict[username] = {"Username": username, "Password": password} print(maindict)
运行后录入两组账号的输出符合预期:
Enter username: test1 Enter password: test1-password {'test1': {'Username': 'test1', 'Password': 'test1-password'}} Enter username: test2 Enter password: test2-password {'test1': {'Username': 'test1', 'Password': 'test1-password'}, 'test2': {'Username': 'test2', 'Password': 'test2-password'}}
写法2:复用子字典变量时传入副本
如果你确实要保留提前定义subdict、每次填充后清空的编码习惯,需要在赋值给主字典时传入子字典的浅拷贝,让主字典存储独立的新字典对象,后续修改/清空原subdict都不会影响已存入的内容:
maindict = {} subdict = {} while True: username = input("Enter username: ") if not username: break password = input("Enter password: ") subdict["Username"] = username subdict["Password"] = password # 传入子字典的拷贝,而非原对象本身 maindict[username] = subdict.copy() # 此时清空subdict不会影响maindict中已存储的内容 subdict.clear() print(maindict)
注意:原问题代码里子字典的键为全小写的username/password,和需求中要求的首字母大写Username/Password格式不一致,上述代码已经对齐需求格式。
内容的提问来源于stack exchange,提问作者user16458161
相关产品推荐
相关产品推荐

