Python 将对象的实例附加到列表只适用于耗时的deepcopy,如何更改?
我有一个pymzml包中的pymzml.run.Reader类。这是一个生成器对象,当循环通过它时,它会生成Spectrum类的实例(也来自pymzml包)。我正在比较不同的实例。因为pymzml.run.Reader是一个生成器对象,在遍历它们之后,它们就不能再使用了,所以我将它们保存在一个列表中,以便稍后进行比较 然而,当我将它们保存在一个列表中,然后在列表中循环打印光谱的id时,它显示它只保存最后一个光谱。澄清: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
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并从中删除一些信息,这需要花费大量时间。。无论如何,谢谢你的回答。