我在将两个类对象添加在一起时遇到一些问题。 这是给我的代码,它将运行我的文件、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 集的正确值。但它也会改变集合 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 值仍然发生变化。我不明白为什么。
最佳答案
当你这样做时:
self2=self
self
和 self2
都指向同一个对象,因此当其中一个对象发生更改时,另一个对象也会发生更改。最简单的修复方法是创建一个新的 HyperLogLog
对象,因此您可以将上面的行替换为:
self2=HyperLogLog()
关于python - 将 2 个 python 类对象添加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52801570/