将对象添加到Python列表中

28 投票
4 回答
164768 浏览
提问于 2025-04-15 18:52

我想把一个对象添加到一个列表里,但因为我添加的是实际的对象,所以当我之后尝试重置这个列表时,列表里的所有值都被重置了。有没有什么办法可以把一个监视器对象添加到列表中,并且可以改变这些值,而不影响我已经保存的列表里的值呢?

谢谢

代码:

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 呢?

撰写回答