gpt4 book ai didi

python - 如何在不引用对象的情况下复制对象?

转载 作者:行者123 更新时间:2023-11-28 20:51:32 24 4
gpt4 key购买 nike

我不确定我的标题是否符合我要查找的内容,但我认为引用是问题所在。

我有一个可以循环访问的 Reader 对象:

msrun = pymzml.run.Reader(mzmlFile)
for feature in msrun:
print feature['id']

通过这段代码,我获得了 msrun 中所有功能的 ID,从 1 开始。但是,我需要先遍历代码并获取我想要的所有键并将它们放入列表中,如下所示:

def getKeys(msrun, excludeList):
spectrumKeys = []
done = False
for spectrum in msrun:
if done:
break
if spectrum['ms level'] == 2:
for key in spectrum:
if key not in excludeList and not key.startswith('MS:'):
done = True
spectrumKeys.append(key)
spectrumKeys.extend(spectrum['precursors'][0].keys())
precursorKeys = spectrum['precursors'][0].keys()
break
return spectrumKeys, precursorKeys

但是,如果我运行这段代码:

msrun = pymzml.run.Reader(mzmlFile)
specKeys, precursKeys = getKeys(msrun, ['title','name'])
for feature in msrun:
print feature['id']

它从没有进入 getKeys() 循环的 id 开始(它从 11 而不是 1 开始)。所以我猜 pymzml.run.Reader() 就像生成器对象一样工作。所以我尝试复制对象。首先我尝试了

copyMsrun = msrun
specKeys, precursKeys = getKeys(copyMsrun, ['title','name'])

但这会产生同样的问题,如果我理解正确的话,因为执行 copyMsrun = msrun 会使它们指向同一件事。

然后我试了一下

import copy
copyMsrun = copy.copy(msrun)

但是我还是遇到了同样的问题。我使用 copy.copy 而不是 copy.deepcopy 因为我不认为 Reader 对象包含其他对象,当我尝试 deepcopy 时我得到

TypeError: object.__new__(generator) is not safe, use generator.__new__().

那么,我如何复制一个对象,以便在一个对象中循环不影响另一个对象?我应该做吗

msrun = pymzml.run.Reader(mzmlFile)
copyMsrun = pymzml.run.Reader(mzmlFile)

?


编辑:根据 Ade YU 的评论,我也尝试过,但是当我这样做时

spectrumList = []
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum)

for spectrum in spectrumList:
print spectrum['id']

第一次打印给我 1-10,但第二次打印给我十次 10

最佳答案

从 pymzML 的发布和文档来看,很明显这种“病态设计”是故意的。初始化数以千计的频谱对象将产生巨大的计算开销、内存和 CPU 周期,而这些根本不需要。通常,解析大量 mzML 自然需要分析时分析的方法,而不是收集需要稍后分析的所有内容。

话虽如此,pymzML 仍然提供了通过调用 spectrum.deRef() 来“深度复制”光谱的功能。使用此功能的优点是所有不必要的数据将在复制之前被删除,因此提供更小的对象。 pymzML deRef

  run = pymzml.run.Reader(file_to_read, MS1_Precision = 5e-6, MSn_Precision = 20e-6)
for spec in run:
tmp = spec.deRef()

希望对您有所帮助。

关于python - 如何在不引用对象的情况下复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9414379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com