Python类实例变量设置错误:多实例共享全局字典致属性覆盖
问题:类实例共享同一字典属性,导致修改时互相覆盖
你的问题核心是所有实例都引用了同一个全局字典对象。字典属于可变数据类型,当你在__init__中执行self.att = attributes时,并没有创建新的字典,只是让每个实例的self.att指向全局的attributes字典。因此修改任何一个实例的att,都会直接修改这个全局字典,导致所有实例的属性同步变化。
解决方法:给每个实例创建独立的字典副本
你需要在初始化阶段为每个实例生成专属的字典,而非直接引用全局对象,有两种常用实现方式:
方式1:复制全局字典
修改__init__方法,使用字典的copy()方法创建浅拷贝(如果字典中没有嵌套的可变对象,浅拷贝完全够用):
# 假设全局字典定义如下 attributes = {"Name": "", "HP": 100} # 示例默认属性 class newCharacter: def __init__(self): # 为每个实例创建独立的字典副本 self.att = attributes.copy() def __str__(self): return str(self.att["Name"]) def inputAttributes(self): print("\nDefine Name:") self.att["Name"] = input().strip() # 其他属性输入逻辑... def printAttributes(self): for k, v in self.att.items(): print(f"{k}: {v}") print("\n")
方式2:直接在实例中初始化字典(推荐)
如果不需要依赖全局变量,可以直接在__init__中定义实例专属的字典结构,彻底避免全局变量的干扰:
class newCharacter: def __init__(self): # 每个实例初始化时创建新的字典 self.att = {"Name": "", "HP": 100, "Attack": 10} # 自定义默认属性 # 其余方法保持不变...
测试验证
现在执行你的调用代码:
a = newCharacter() a.inputAttributes() a.printAttributes() b = newCharacter() b.inputAttributes() a.printAttributes() b.printAttributes()
此时a和b的att字典完全独立,修改其中一个不会影响另一个的属性值。
内容的提问来源于stack exchange,提问作者dasey
相关产品推荐
相关产品推荐

