我正在尝试创建一个打开多个数据库并比较其内容的Python脚本.在创建该脚本的过程中,我遇到了创建列表的问题,该列表的内容是我创建的对象.
我已经简化了这个帖子的简单程序.首先,我创建一个新类,创建一个新实例,为其分配一个属性,然后将其写入列表.然后我为实例分配一个新值并再次将其写入列表......并一次又一次......
问题是,它始终是同一个对象所以我只是在改变基础对象.当我读到列表时,我反复重复同一个对象.
那么如何在循环中将对象写入列表呢?
这是我的简化代码
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的元素,以便每个条目包含一个不同的对象实例而不是所有指向同一个实例?
你表现出一种根本的误解.
你根本没有创建过SimpleClass的实例,因为你没有调用它.
for count in xrange(4): x = SimpleClass() x.attr = count simplelist.append(x)
或者,如果让类使用参数,则可以使用列表推导.
simplelist = [SimpleClass(count) for count in xrange(4)]
要使用单独的实例填充列表,可以在列表的声明中使用for循环.*multiply将每个副本链接到同一个实例.
instancelist = [ MyClass() for i in range(29)]
然后通过列表的索引访问实例.
instancelist[5].attr1 = 'whamma'
如果你只是简单地使用它来根据其属性输出数据,那么每次都不需要重新创建SimpleClass对象.但是,您实际上并没有创建该类的实例; 您只是创建对类对象本身的引用.因此,您一遍又一遍地向列表(而不是实例属性)添加对同一类属性的引用.
代替:
x = SimpleClass
你需要:
x = SimpleClass()
每次创建一个新实例,其中每个新实例都具有正确的状态,而不是不断修改同一实例的状态.
或者,在每个步骤存储一个明确制作的对象副本(使用此页面上的提示),而不是原始副本.