【发布时间】:2018-10-14 10:04:57
【问题描述】:
我在添加两个类对象时遇到了一些问题。 这是给我的代码,它将运行我的文件、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(set m1) 和 hlls(set 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 集返回正确的值。但它也会改变 set 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 的值仍然改变。我不明白为什么。
【问题讨论】:
标签: python python-3.x function class object