nn.Sequential参数加 * 的理解

def __init__(self, *args, **kwargs)
def init(self, *args, **kwargs): 其含义代表什么?
*args:如果是没有指定key的参数,比如单单‘apple’,‘people’,即为无指定,则会以list的形式放在args变量里面
**kwargs:如果是有指定key的参数,比如item=‘apple’这种形式,即为有指定,则会以dict的形式放在kwargs变量里面
参考:https://blog.youkuaiyun.com/Jiana_Feng/article/details/107861130

def test_demo(*args):
    print(len(args))
    for i in args:
        print(i)

test_list = [9,6,1]
test_demo(test_list) 像这样,传入的 test_list 前面没有加 *,其传入到 test_demo 默认作为tuple,tuple里面是一个list参数,就是args = [9,6,1]

但是:
test_demo(*test_list) 加了 * 就会把 test_list 打散了,作为三个值传入,

所以,在看到:

nn.Sequential(*[m(*args) for _ in range(n)]) 这种参数前面加* ,是为了把[m(*args) for _ in range(n)] -> list 中的值打散了,作为多个值传入,如果不加,就是一个tuple,tuple里面是一个list,nn.Sequential 内部解析会报错:(并不是说一个方法如:test_demo(*args),这个方法就不能传list了,不是这样的,只是传入要符合对应的方法中的要求

之前一直对 nn.Sequential参数为啥加 * 不理解,现在稍微理解了点,当然,如果就一个 subclass,那就直接加到 nn.Sequential(subclass)中了,加* 是对于list而言,就是要把list中的值打散了,传进去就不是list,而是各个值。

个人理解是:方法中的参数是(*args)这样类型的,那传进来的都会解析成 tuple。如果单独对 list 加 *,是不行的,需要在外面再用 [] 包裹下,如:temp = [1,2,3],需要:[*temp]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值