将对象添加到Python列表中
我想把一个对象添加到一个列表里,但因为我添加的是实际的对象,所以当我之后尝试重置这个列表时,列表里的所有值都被重置了。有没有什么办法可以把一个监视器对象添加到列表中,并且可以改变这些值,而不影响我已经保存的列表里的值呢?
谢谢
代码:
arrayList = []
for x in allValues:
result = model(x)
arrayList.append(wM)
wM.reset()
其中 wM 是一个监视器类——这个类是在模型方法中计算或处理的。
4 个回答
2
虽然你应该展示一下导致问题的代码长什么样,但我觉得这种情况很常见。可以看看 copy/deepcopy 相关的内容。
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()
,这是其他人推荐的做法。
26
你的问题是不是跟这个类似:
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
是从哪里来的。难道你只是不断复制同一个 wM
对象吗?除了第一次清空它,之后的都不会有内容?或者 model()
会修改 wM
(我觉得这听起来像是个设计缺陷)?还有,为什么你要丢掉 result
呢?