在Python中创build一个对象列表

我正在尝试创build一个Python脚本来打开几个数据库并比较它们的内容。 在创build脚本的过程中,我创build了一个列表,其内容是我创build的对象。

我已经简化了这个计划,只是为了这个贴子。 首先,我创build一个新的类,创build一个新的实例,为它分配一个属性,然后写入一个列表。 然后,我为实例分配一个新的值,并再次写入一个列表…并一次又一次…

问题是,它总是相同的对象,所以我只是改变基础对象。 当我阅读清单时,我一遍又一遍地重复了同一个对象。

那么如何将对象写入循环中的列表呢?

谢谢,

鲍勃·J

这是我的简化代码

class SimpleClass(object): pass x = SimpleClass # Then create an empty list simpleList = [] #Then loop through from 0 to 3 adding an attribute to the instance 'x' of SimpleClass for count in range(0,4): # each iteration creates a slightly different attribute value, and then prints it to # prove that step is working # but the problem is, I'm always updating a reference to 'x' and what I want to add to # simplelist is a new instance of x that contains the updated attribute x.attr1= '*Bob* '* count print "Loop Count: %s Attribute Value %s" % (count, x.attr1) simpleList.append(x) print '-'*20 # And here I print out each instance of the object stored in the list 'simpleList' # and the problem surfaces. Every element of 'simpleList' contains the same attribute value y = SimpleClass print "Reading the attributes from the objects in the list" for count in range(0,4): y = simpleList[count] print y.attr1 

那么我如何(追加,扩展,复制或其他)simpleList的元素,使每个条目包含对象的不同实例,而不是所有指向同一个?

你performance出根本的误解。

你从来没有创build一个SimpleClass的实例,因为你没有调用它。

 for count in xrange(4): x = SimpleClass() x.attr = count simplelist.append(x) 

或者,如果让class级带参数,则可以使用列表理解。

 simplelist = [SimpleClass(count) for count in xrange(4)] 

要用一个类的单独实例填充列表,可以在列表的声明中使用for循环。 *乘法将每个副本链接到同一个实例。

 instancelist = [ MyClass() for i in range(29)] 

然后通过列表的索引访问实例。

 instancelist[5].attr1 = 'whamma' 

如某些人所build议的,如果您只是简单地使用SimpleClass对象来输出基于属性的数据,那么不需要重新创buildSimpleClass对象。 但是,实际上并没有创build类的实例。 你只是创build一个对类对象本身的引用。 因此,您将反复添加对列表(而不是实例属性)的相同类属性的引用。

代替:

 x = SimpleClass 

你需要:

 x = SimpleClass() 

每次创build一个新实例,每个新实例具有正确的状态,而不是连续修改同一实例的状态。

或者,在每一步中存储一个明确制作的对象副本( 在本页使用提示),而不是原始的。

如果我正确理解你的问题,你可以问一个方法来执行一个对象的深层副本。 怎么使用copy.deepcopy?

 import copy x = SimpleClass() for count in range(0,4): y = copy.deepcopy(x) (...) y.attr1= '*Bob* '* count 

deepcopy是整个对象的recursion副本。 更多的参考资料,你可以看看python文档: https : //docs.python.org/2/library/copy.html