2010-02-04 79 views
20

我试图将一个对象添加到列表,但自从我加入了实际的对象,当我尝试之后重置列表,列表中的所有值复位。 是否有一种实际的方式可以将监视器对象添加到列表中,并更改值并且不会影响已保存在列表中的那些值?对象添加到Python列表

感谢

代码:

arrayList = [] 

for x in allValues: 


     result = model(x) 

     arrayList.append(wM) 

     wM.reset() 

其中WM是显示器类 - 正计算/模型方法计算出

+3

我不明白你的问题。显示出现问题的一些简单代码可能会有所帮助。 – 2010-02-04 02:23:57

+3

什么是“数组列表”?一个“列表”? – 2010-02-04 02:50:06

+0

是它的一个列表。 – Lilz 2010-02-04 03:05:48

回答

20

是你的问题与此类似:

l = [[0]] * 4 
l[0][0] += 1 
print l # prints "[[1], [1], [1], [1]]" 

如果是这样,你只需要在你存储它们复制的对象:

import copy 
l = [copy.copy(x) for x in [[0]] * 4] 
l[0][0] += 1 
print l # prints "[[1], [0], [0], [0]]" 

有问题的对象应该实现一个__copy__方法来复制对象。请参阅copy的文档。您也可能对copy.deepcopy感兴趣,这也在那里。

编辑:这就是问题所在:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(wM) # appends the wM object to the list 
    wM.reset()   # clears the wM object 

您需要添加一个副本:

import copy 
arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(copy.copy(wM)) # appends a copy to the list 
    wM.reset()      # clears the wM object 

但我仍然感到困惑的地方wM的来源。难道你不是只是一遍又一遍地复制同一个对象,除非在第一次之后清除它,所有其余的都是空的?或者model()修改wM(这听起来像是一个可怕的设计缺陷)?你为什么要扔掉result

+0

+1我在猜测OP的问题与此相关 – ghostdog74 2010-02-04 02:30:29

+0

非常感谢你的支持 – Lilz 2010-02-04 03:09:24

+0

@Lily - 如果你已经阅读并思考过我的原始答案或ghostdog74的答案,那么你可以自己做这个。您应该考虑阅读文档,特别是关于不可变与可变对象以及'copy'模块。 – 2010-02-04 03:22:07

2

,而你应该表现出你的代码看起来是这样的给出了这个问题,我认为这种情况非常普遍。见copy/deepcopy

+0

+1打我。 – 2010-02-04 02:29:16

3

您需要在修改其内容之前创建列表的副本。一个快捷键复制清单是这样的:

mylist[:] 

例子:

>>> first = [1,2,3] 
>>> second = first[:] 
>>> second.append(4) 
>>> first 
[1, 2, 3] 
>>> second 
[1, 2, 3, 4] 

,并表明将修改的一部开拓创新的列表(默认行为,因为在Python中的名字只是给一个参考基础对象):

>>> first = [1,2,3] 
>>> second = first 
>>> second.append(4) 
>>> first 
[1, 2, 3, 4] 
>>> second 
[1, 2, 3, 4] 

请注意,这只适用于列表。如果您需要复制字典的内容,则必须按其他人的建议使用copy.deepcopy()

0

如果我是正确的认为要添加变量,数组,但是当你改变阵列以外的变量,它也改变了数组里面,但你不希望它那么它是一个非常简单的解。

当要保存的变量数组,你应该使用简单的把STR(VARIABLENAME)把它变成一个字符串。例如:

array.append(str(variablename)) 

使用这种方法你的代码应该是这样的:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(str(wM))  #this is the only line that is changed. 
    wM.reset() 
+0

这给了我一个错误。 – 2014-05-15 07:20:24