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