当前位置:  开发笔记 > 编程语言 > 正文

在Python中创建对象列表

如何解决《在Python中创建对象列表》经验,为你挑选了4个好方法。

我正在尝试创建一个打开多个数据库并比较其内容的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的元素,以便每个条目包含一个不同的对象实例而不是所有指向同一个实例?



1> ironfroggy..:

你表现出一种根本的误解.

你根本没有创建过SimpleClass的实例,因为你没有调用它.

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

或者,如果让类使用参数,则可以使用列表推导.

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


不适用于python 3.x-不再支持xrange()函数。
@TitPoplatnik只需将xrange()替换为range()。

2> Zoomulator..:

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

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

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

instancelist[5].attr1 = 'whamma'


更好的是:instancelist = [myClass()for _ in range(29)]

3> Daniel Naab..:

如果你只是简单地使用它来根据其属性输出数据,那么每次都不需要重新创建SimpleClass对象.但是,您实际上并没有创建该类的实例; 您只是创建对类对象本身的引用.因此,您一遍又一遍地向列表(而不是实例属性)添加对同一类属性的引用.

代替:

x = SimpleClass

你需要:

x = SimpleClass()


`x = SimpleClass()`_is_每次都重新创建对象.

4> joel.neely..:

每次创建一个新实例,其中每个新实例都具有正确的状态,而不是不断修改同一实例的状态.

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有