定义字典的键/值对和在python中定义字典之间有什么区别?

时间:2013-11-28 01:31:53

标签: python dictionary

我在一个类中有这两个函数

Class A(object):
    my_dict{"a":1, "b":2, "c":3}

    def set_dict(self,key,value):
    self.my_dict[key] = value

    def set_dict2(self,dict):
    self.my_dict= dict   

然后我创建一个类对象

obj1 = A()
obj1.set_dict("a",4)
obj1.set_dict("b",5)
obj1.set_dict("c",6)
obj2 = A()
obj2.set_dict("a",7)
obj2.set_dict("b",8)
obj2.set_dict("c",9)

如果我执行上述操作,则obj1和obj2都具有{a:7,b:8,c:9},因为obj1也会因对obj2的最新更改而更改。但如果这样做,它的工作正常:

obj1 = A()
obj1.set_dict2({"a":4, "b":5, "c":6})
obj2 = B()
obj2.set_dict2({"a":7, "b":8, "c":9})

所以问题是set_dict()做错了什么?

2 个答案:

答案 0 :(得分:2)

那是因为my_dict是一个类变量。当你说my_dict[key] = value时,你正在修改类中的字典,而不是修改变量。

为了更清楚,让我们看一下这个控制台会话:

>>> a = A()
>>> a.set_dict('a', 7)
>>> A.my_dict
{'a': 7, 'c': 3, 'b': 2}
>>> n = A()
>>> n.set_dict('a', 10)
>>> A.my_dict
{'a': 10, 'c': 3, 'b': 2}

因此,您正在更改A.my_dict而不是a.my_dict。要解决此问题,您需要将其设为实例变量:

class A(object):
    def __init__(self):
        self.my_dict = {"a":1, "b":2, "c":3}

    def set_dict(self,key,value):
        self.my_dict[key] = value

    def set_dict2(self,dct):
        self.my_dict = dct

希望这有帮助!

答案 1 :(得分:0)

你需要让my_dict成为一个实例变量,例如:

Class A(object):
    def __init__(self):
        self.my_dict{"a":1, "b":2, "c":3}

    def set_dict(self,key,value):
        self.my_dict[key] = value

    def set_dict2(self,dict):
        self.my_dict= dict