为何两个不同Python对象的字典表现为同一个字典?
为什么两个Node实例共享同一个字典?
这是因为你定义的Dictionary是类变量,而不是实例变量——它属于Node类本身,所有创建出来的Node实例都会共享这同一个字典对象,所以不管你通过node1还是node2去修改它,都是在操作同一个东西。
具体解释
在你的代码里:
class Node: Dictionary={} # 这是类变量,属于整个Node类
类变量是在类定义时就创建的,所有实例都会指向同一个引用。所以当你给node1.Dictionary添加元素,再给node2.Dictionary添加元素,本质上都是在修改同一个字典。
修复方案
要让每个Node实例拥有独立的字典,你需要把Dictionary移到__init__方法里,定义为实例变量(用self.前缀):
class Node: def __init__(self): self.Dictionary = {} # 每个实例初始化时都会创建自己的字典 def main(): node1 = Node() node2 = Node() node1.Dictionary.setdefault(1, []).append('a') node1.Dictionary.setdefault(2, []).append('b') node2.Dictionary.setdefault(3, []).append('c') node2.Dictionary.setdefault(4, []).append('d') print("Node 1 ",node1.Dictionary.values()) print("Node 2 ",node2.Dictionary.values()) main()
运行这段代码,输出就会符合你的预期:
Node 1 dict_values([['a'], ['b']]) Node 2 dict_values([['c'], ['d']])
小提示
如果你想验证变量的归属,可以打印类和实例的__dict__属性:
print(Node.__dict__)会显示类的属性,原来的代码里Dictionary会在这里;print(node1.__dict__)会显示实例的属性,修改后的代码里Dictionary会在这里。
内容的提问来源于stack exchange,提问作者Krishn Nand
相关产品推荐
相关产品推荐

