python - 将 2 个 python 类对象添加在一起

标签 python python-3.x function class object

我在将两个类对象添加在一起时遇到一些问题。 这是给我的代码,它将运行我的文件、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

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

self2=HyperLogLog()

关于python - 将 2 个 python 类对象添加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52801570/

相关文章:

python - 比 venv 更快的 virtualenv 是什么意思?就在创作的时候?或者在运行应用程序和脚本时?

python - 如何使用 Python Backoff 库根据 http 错误代码进行重试?

json - 将 github json 数据格式化为包含每日日期的 pandas 数据框

python - 如何将列表列表打印为简单字符串?

php:我可以在类方法中创建和调用函数吗?

java - 如何将 double 转换为 Java 中的精确小数?

python - Pandas DataFrame.groupby() 到具有多列值的字典

python - 如何在centos pyvenv中安装python3.4 psycopg2

C: 忽略 scanf 的返回值

Python,来自其他列表的元素对的列表