我在添加两个类对象时遇到一些问题。 这是给我的代码,它将运行我的文件、超日志和示例文本文件:
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值仍然更改。我不明白为什么。在
这不会创建新的对象实例。它只是给同一个对象指定另一个名称。在
您应该在
^{pr2}$__add__
方法中创建一个新的HyperLogLog
对象。 像这样:执行此操作时:
^{pr2}$self
和self2
都指向同一个对象,因此当一个对象被更改时,另一个对象也会随之更改。最简单的修复方法是创建一个新的HyperLogLog
对象,因此您可以将上面的行替换为:相关问题 更多 >
编程相关推荐