如何防止dict.pop()操作同时修改原字典与引用字典?
问题原因与解决方法
你碰到的问题本质是Python中可变对象的引用特性:字典属于可变对象,当你执行bak = animal时,并没有复制出一个新字典,只是让bak和animal指向了内存里同一个字典实例。所以对bak做的任何修改(比如pop("name")),都会直接作用在原字典animal上。
要实现只修改bak不影响原字典,你需要创建原字典的独立副本,下面是几种简单可行的方式:
方法1:使用字典的copy()方法
copy()会生成原字典的浅拷贝,新字典和原字典完全独立,是最常用的方式:
bak = animal.copy() bak.pop("name")
方法2:用dict()构造函数生成副本
通过dict()传入原字典,同样能创建出一个新的字典对象:
bak = dict(animal) bak.pop("name")
方法3:字典推导式一步生成目标字典
如果你的需求就是得到去掉name键的字典,可以直接用推导式一步完成,省去后续pop操作:
bak = {k: v for k, v in animal.items() if k != "name"}
替换后的完整代码示例(以copy()方法为例)
horse = { "name": "Horse", "legs": 4, "land": "yes", "pet": "yes", "stripe": "no" } dolphin = { "name": "Dolphin", "legs": 0, "land": "no", "pet": "no", "stripe": "no" } userIn = dict() userIn["legs"] = int(input("How many legs does it have? ")) userIn["land"] = input("Is it a land animal (yes/no)? ") userIn["pet"] = input("Is it a pet? ") userIn["stripe"] = input("Does it have stripes? ") animals = [horse, dolphin] for animal in animals: bak = animal.copy() bak.pop("name") print(bak) print(animal) if bak == userIn: print(animal["name"])
这样修改后,bak.pop("name")只会删除副本里的name键,原animal字典的结构完全不受影响。
内容的提问来源于stack exchange,提问作者ecjwthx
相关产品推荐
相关产品推荐

