我有一个来自 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/