Accumulator是如何累加三个参数的呢

我注意到add函数中,只使用列表生成式将两个列表(类似列表)参数进行累加,可是在后面train_epoch_ch3函数的定义中,将add传入了三个参数,可是定义中只有a, b两个参数的相加:[a + float(b) for a, b in zip(self.data, args)],那么是如何实现的三个参数相加呀?希望各位大佬能给小白我指点一下,冥思苦想想不出为啥 :grimacing:

class Accumulator:  #@save
    """在`n`个变量上累加。"""
    def __init__(self, n):
        self.data = [0.0] * n

    **def add(self, *args):**
**        self.data = [a + float(b) for a, b in zip(self.data, args)]**

    def reset(self):
        self.data = [0.0] * len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]
def train_epoch_ch3(net, train_iter, loss, updater):  #@save
    """训练模型一个迭代周期(定义见第3章)。"""
    # 将模型设置为训练模式
    if isinstance(net, torch.nn.Module):
        net.train()
    # 训练损失总和、训练准确度总和、样本数
    metric = Accumulator(3)
    for X, y in train_iter:
        # 计算梯度并更新参数
        y_hat = net(X)
        l = loss(y_hat, y)
        if isinstance(updater, torch.optim.Optimizer):
            # 使用PyTorch内置的优化器和损失函数
            updater.zero_grad()
            l.backward()
            updater.step()
            metric.add(
                float(l) * len(y), accuracy(y_hat, y),
                y.size().numel())
        else:
            # 使用定制的优化器和损失函数
            l.sum().backward()
            updater(X.shape[0])
            metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
    # 返回训练损失和训练准确率
    return metric[0] / metric[2], metric[1] / metric[2]

def add(self, args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
你看下整个函数的定义 其中zip函数是把两个数列合并成一个数列,其中每一个元素是一个包含 a和b的元组,前面的表达式的计算这个数列里面包含的每个元组中的2个元素的和,具体有多少个参数相加是由 函数定义里面的
args这个可变参数决定的

我懂了,谢谢大佬,原来args是作为一个整体和self.data合并的,我还一直以为是类似多个self.data合并的,被我自己蠢哭了 :sob: