Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将对象的实例附加到列表只适用于耗时的deepcopy,如何更改?_Python_List_Deep Copy - Fatal编程技术网

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

Python 将对象的实例附加到列表只适用于耗时的deepcopy,如何更改?,python,list,deep-copy,Python,List,Deep Copy,我有一个pymzml包中的pymzml.run.Reader类。这是一个生成器对象,当循环通过它时,它会生成Spectrum类的实例(也来自pymzml包)。我正在比较不同的实例。因为pymzml.run.Reader是一个生成器对象,在遍历它们之后,它们就不能再使用了,所以我将它们保存在一个列表中,以便稍后进行比较 然而,当我将它们保存在一个列表中,然后在列表中循环打印光谱的id时,它显示它只保存最后一个光谱。澄清: import pymzml def test(msrun): fo

我有一个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') 

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

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

问题是你一次又一次地得到同一个物体

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

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


最有可能的情况是,您确实需要
decRef()
使它们相互独立——否则,为什么类会提供一个特殊的方法?

是的,您是对的,它是相同的内存地址。Spectrum.deRef()使用deepcopy并从中删除一些信息,这需要花费大量时间。。无论如何,谢谢你的回答。