同时添加2个python类对象

2024-10-01 00:22:17 发布

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

我在添加两个类对象时遇到一些问题。 这是给我的代码,它将运行我的文件、超日志和示例文本文件:

import HyperLogLog
import sys

hlls = [HyperLogLog.HyperLogLog() for _ in range(5)]

with open(sys.argv[1], "r") as file:
for line in file:
    cleanLine = line.replace("\n", "")
    (cmd, set, value) = cleanLine.split(" ")[:3]
    # See if this was an add, count, or merge command
    if cmd == "A":
        hlls[int(set)].add(value)
    elif cmd == "C":
        estimate = hlls[int(set)].count()
        print("Estimate:", estimate, "Real count:", value)
    elif cmd == "M":
        (cmd, m1, m2, m3) = cleanLine.split(" ")
        hlls[int(m3)] = hlls[int(m1)] + hlls[int(m2)]

最底层的一行是合并hlls(集合m1)和hlls(集合m2)。hlls(setx)存储一个参数M,这是我的超日志向量。我需要创建一个add函数来使上面的加法行工作。我做了如下工作:

^{2}$

这将返回m3集合的正确值。但它也会改变集合m1的self.M值。我怎样才能返回self之外的东西,它将使hlls[int(m3)]和HyperLogLog类的实例具有合并的self.M值?在

如果我只返回Sum函数,hlls[int(m3)]不再是HyperLogLog类的实例。在

如果我像我这样改变self.M,我会改变hlls[int(m1)]的self.M值。在

如果我做一些类似的事情:

    def __add__(self, other):
        Sum=other.M
        for i,value in enumerate(other.M):
            if value<self.M[i]:
                Sum[i]=self.M[i]

        self2=self
        self2.M=Sum


        return self2

实例hlls[int(m1)]的self.M值仍然更改。我不明白为什么。在


Tags: inselfcmdaddforifvalueint
2条回答

这不会创建新的对象实例。它只是给同一个对象指定另一个名称。在

self2=self

您应该在__add__方法中创建一个新的HyperLogLog对象。 像这样:

^{pr2}$

执行此操作时:

self2=self

selfself2都指向同一个对象,因此当一个对象被更改时,另一个对象也会随之更改。最简单的修复方法是创建一个新的HyperLogLog对象,因此您可以将上面的行替换为:

^{pr2}$

相关问题 更多 >