一个关于zip()函数的神奇发现

今天在看莫烦的pytorch教程的时候,在4种优化器的表现时有一段代码没看懂如下:

...

losses = [[], [], [], []]

if __name__ == '__main__':
    for epoch in range(EPOCH):
        for step,(b_x, b_y) in enumerate(loader):
            for net,opt,los in zip(nets,optimizers,losses):
                
                output = net(b_x)
                loss = loss_func(output, b_y)
                opt.zero_grad()
                loss.backward()
                opt.step()

                los.append(loss.data[0])

    labels = ['GSD', 'Momentum', 'RMSprop', 'Adam']
    for i, l_his in enumerate(losses):
        plt.plot(l_his,label=labels[i])

    plt.legend(loc='best')
    plt.xlabel('Steps')
    plt.ylabel('Loss')
    plt.show()
上面的代码中加粗的部分,对于定义的losses空矩阵,后续代码中并没有losses.append的操作,但是执行完毕后却发现,losses中被添加了数据。找了很多资料都不知道是怎么完成的。都没有这一部分的内容。后来经过实验,发现,当zip中有空数组时,执行zip操作后返回的list中对应位置的值会代替空数组,如果zip的iteral参数部位空,返回的是本身,即本身代替了本身。但是,看以下代码:

a = [1,2,3]

b=[[],[],[]]

for i,j in zip(a,b):
    print(i,j,type(j))
    j.append(i+1)
    
1 [] <class 'list'>
2 [] <class 'list'>
3 [] <class 'list'>

b
Out[24]: [[2], [3], [4]]

此时的b已经被替换!

b=[[],[],[]]

for i,j in zip(a,b):
    print(i,j,type(j))
    j.append(i+1)
    print(b,j)
    
1 [] <class 'list'>
[[2], [], []] [2]
2 [] <class 'list'>
[[2], [3], []] [3]
3 [] <class 'list'>
[[2], [3], [4]] [4]

猜你喜欢

转载自blog.csdn.net/qq_21210467/article/details/81395610