我遇到了一个非常具体的问题,我找不到网上任何地方的答案。我是python代码的新手(C ++是我的第一语言),所以我假设这只是一个语义问题。我的问题是关于在for循环范围内声明的对象。
此代码的目标是在for循环中创建一个新的临时对象,将一些项添加到它的列表中,然后将该对象放入for循环之外的列表中。在for循环的每次迭代中,我希望创建一个NEW,SEPARATE对象来填充项目。但是,每次执行for循环时,对象的列表都已填充上一次迭代中的项目。
我有一个更大的程序遇到了同样的问题,但是我没有包含大量的程序,而是编写了一个具有相同语义问题的小例子:
#Test
class Example:
items = []
objList = []
for x in xrange(5):
Object = Example()
Object.items.append("Foo")
Object.items.append("Bar")
print Object.items
objList.append(Object)
print "Final lists: "
for x in objList:
print x.items
在程序结束时,objList中的每个项目(甚至是第一次迭代中的项目)都包含
["Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar","Foo","Bar"]`
这让我相信示例(在这种情况下称为Object)不会在每次迭代中重新创建,而是在每次迭代中保持,并在每次for循环继续时访问。
我的简单问题;在python中,如何更改此内容?
答案 0 :(得分:3)
将班级定义更改为:
class Example:
def __init__(self):
self.items = []
问题是items
没有绑定到每个对象的实例,它是类定义的一部分。因为items
是一个类变量,所以它在Example的实例之间共享。
答案 1 :(得分:2)
您的班级Example
正在使用class variable Example.items
来存储字符串。类变量在对象的所有实例之间共享,这就是为什么你将它们全部组合在一起并认为它实际上是同一个对象,它不是。
您应该创建items
变量并将其分配到self
函数中的__init__
class Example(object):
def __init__(self):
self.items = []
这将确保Example
的每个实例都有自己的items
列表。
另外,当你使用Python 2.x时,你真的应该像我那样继承object
。