gpt4 book ai didi

python - 将对象的实例附加到列表仅适用于耗时的深度复制,我该如何更改它?

转载 作者:行者123 更新时间:2023-11-28 18:52:39 29 4
gpt4 key购买 nike

我有一个来自 pymzml 包的 pymzml.run.Reader 类。这是一个生成器对象,当循环遍历它时,它会产生 Spectrum 类的实例(也来自 pymzml 包)。我正在相互比较不同的实例。因为pymzml.run.Reader是一个生成器对象,循环遍历后就不能再使用了,所以我把它们保存在一个列表中,以便稍后比较。

但是,当我将它们保存在一个列表中,然后遍历打印光谱 ID 的列表时,它显示它只保存了最后一个光谱。澄清一下:

import pymzml

def test(msrun):
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum)
print '-'*20
for i in spectrumList:
print i['id']

msrun = pymzml.run.Reader(r'JG_Ti02-C1-1_C2-01A_file1.aligned.mzML')

给出:

1
2
3
4
5
--------------------
5
5
5
5
5

pymzml 有一个 deRef() 函数,可以对光谱进行深层复制,因此以下内容可以正常工作:

import pymzml

def test(msrun):
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum.deRef())

msrun = pymzml.run.Reader(r'JG_Ti02-C1-1_C2-01A_file1.aligned.mzML')

然而,制作深度复制是我试图摆脱我的应用程序的主要瓶颈。如何将频谱实例附加到列表中,以便不仅最后一个频谱被附加多次?

最佳答案

不能只是保存最后一个光谱——您正在做所有正确的事情来将每个对象保存到列表中。

问题是你一遍又一遍地得到同一个对象。

在循环中打印 id(spectrum) 以获取其内存地址将显示它是一个重复的对象,其 id 和其他属性已更改。

虽然您不一定需要 copy.deepcopy(),但您确实需要复制一份。尝试 copy.copy(),并查看 Spectrum.decRef() 的源代码以了解它是如何进行复制的。

很可能,您确实需要decRef() 使它们独立——否则,为什么该类会提供一种特殊的方法?

关于python - 将对象的实例附加到列表仅适用于耗时的深度复制,我该如何更改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924178/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com