将对象的实例附加到列表中只适用于耗时的deepcopy,如何更改?

2024-04-30 07:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pymzml.run.Reader读取器从pymzml包初始化。这是一个生成器对象,当循环通过它时,它产生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') 

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


Tags: 对象实例runinid列表for读取器
1条回答
网友
1楼 · 发布于 2024-04-30 07:11:58

它不可能只是保存最后一个光谱你正在做所有正确的事情来保存列表中的每个对象。你知道吗

问题是你一次又一次地得到同一个物体。你知道吗

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

虽然您不一定需要copy.deepcopy(),但您确实需要制作一个副本。试试copy.copy(),看看Spectrum.decRef()的源代码,看看它是如何复制的。你知道吗

很可能,您确实需要decRef()每个类使它们独立,否则,为什么类会提供一个特殊的方法?你知道吗

相关问题 更多 >