Python - 为什么会这样?

时间:2011-06-28 17:21:03

标签: python dictionary

我是Python的新手,并注意到我认为它是一个错误。

编辑2011-09-30: 算了吧。现在我知道创建的属性是静态的,并在实例之间共享。 希望这个帖子可以帮助其他python新手处于和我相同的情况。

请考虑以下代码:

class test():

    dictionary1 = {}
    list1 = []

    def method1(self):
        self.dictionary1.update({'1': 'unique entry'})
        self.list1 = ['unique list entry']

t=test()

print 'dictionary1 value:', t.dictionary1
print 'list1 value:', t.list1
t.method1()
print 'dictionary1 new value:', t.dictionary1
print 'list1 new value:', t.list1

t2=test()
print 'dictionary1 value:', t2.dictionary1, " -- error -- I just instantiated the class. The correct value would be {}"
print 'list1 value:', t.list1
t2.method1()
print 'dictionary1 new value:', t.dictionary1
print 'list1 new value:', t.list1

现在的问题是:

为什么在第19行中执行的代码显示:{'1': 'unique entry'}。我相信它会是:{} 请注意,列表具有正确的值:[](第20行中的空列表)

Using Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2

抱歉不太好英语。来自巴西。

编辑2011-09-30: 算了吧。现在我知道创建的属性是静态的,并在实例之间共享。 希望这个帖子可以帮助其他python新手处于和我相同的情况。

3 个答案:

答案 0 :(得分:14)

test类的所有实例共享相同的字典和列表。初始化成员的正确方法是:

class Test():
    def __init__(self):
        self.dictionary1 = {}
        self.list1 = []

直接在类体中分配的属性将被评估一次,然后在所有实例之间共享。由于__init__方法每个实例运行一次,因此将为每个实例创建一个新的列表和字典。

答案 1 :(得分:7)

在类体(static class variables)中直接声明的变量在类的所有实例之间共享。因此,改变它们并不是一个好主意。

而是在构造函数中初始化对象成员变量:

class test(object):
    def __init__(self):
        self.dictionary1 = {}
    def method1(self):
        self.dictionary1.update({'1': 'unique entry'})

答案 2 :(得分:5)

要添加到其他答案,您看到dictlist的不同行为的原因是:当您编写self.dictionary1.update({'1': 'unique entry'})时,您更改self.dictionary1的内容},但它仍然是相同的dict对象。当您编写self.list1 = ['unique list entry']时,将self.list1替换为新的list对象。通过执行以下操作,您将获得与dict相同的行为。self.list1.append('unique list entry')