在将两个类对象加在一起时遇到一些问题。 这是给我的代码,它将运行MY文件,HyperLogLog和示例文本文件:
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(set x)存储单个参数M,这是我的HyperLogLog向量。我需要做一个 add 函数使上面的附加行起作用。我这样做如下:
class HyperLogLog:
def __init__(self):
self.M = [0 for x in range(m)]
##############
Code altering the 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]
self.M=Sum
return self
这将为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值仍然更改。我不明白为什么。
答案 0 :(得分:0)
这不会创建新的对象实例。只是为同一对象分配了另一个名称。
self2=self
您应该在HyperLogLog
方法中创建一个新的__add__
对象。
像这样:
def __add__(self, other):
retval = HyperLogLog()
retval.M = [max(a, b) for a, b in zip(self.M, other.M)]
return retval
答案 1 :(得分:0)
执行此操作时:
self2=self
self
和self2
都指向同一个对象,因此当一个更改时,另一个也会更改。最简单的解决方法是创建一个新的HyperLogLog
对象,因此您将上面的行替换为:
self2=HyperLogLog()