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

标签 python list deep-copy

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

相关文章:

c++ - OpenCV cv::Mat 的深拷贝

c - C 中的深度复制数组... malloc?

python - 使用类时将用户输入保存到文本小部件 Tkinter

python - django - 从一个文件调用函数到另一个文件

PHP "list"问题 : Why the result is in reverse order?

python - 将输入(来自标准输入)转换为列表

python打印逐行递​​增的列表项

php - Doctrine 记录的深拷贝

python - 将 Python AES 转换为 Node

python - 从文件中读取两列列表并排序