一个关于作用域的吐槽

查看 95|回复 8
作者:Aloento   
今天在看 Hifigan 的源码,突然发现 IDE 提示 ch 变量 warning
    self.resblocks = nn.ModuleList()
    for i in range(len(self.ups)):
      ch = upsample_initial_channel // (2 ** (i + 1))
      for j, (k, d) in enumerate(zip(resblock_kernel_sizes, resblock_dilation_sizes)):
        self.resblocks.append(resblock(ch, k, d))
    self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False)
    self.ups.apply(init_weights)

局部变量 ch 可能在赋值之前使用

首先说明本人不会 python ,今天看到这段百思不得其解
询问 AI 也没问出个所以然,遂询问朋友
得到了这样的回答:

Python 的 for 不认为是作用域


Python 没有语句块的概念


最小作用域就是闭包或者函数

知道这个以后我脑海中只有一句话
真的是令人叹为观止

Python, sblo, cks, UPS

zhlxsh   
局部变量 ch 可能在赋值之前使用
这句话是说,在 for 循环结束后使用了 ch ?
假设我理解没错,语言没有强制规定 for 循环作用域,代码跑起来没问题,编译器报语法错误。 那就是是写的人不规范😂
enchilada2020   
这…你可能没写过 JS ?
enchilada2020   
不对啊 你写过 JS 为啥会叹为观止…ES6 之前不都这样吗
enchilada2020   
直接 var 或者连 var 都不写 就直接在 global 上定义属性才叫叹为观止…
Aloento
OP
  
@enchilada2020 我是直接从 ES6 开始学的 JS (不如说一来就用的 TS )
然后写代码一直都是非常的规范,从来没用过黑魔法
所以说虽然我知道 var 是全局,但是 python 这种连 var / let / := 也不需要的语言
属实是超出了我的认知范围
enchilada2020   
@Aloento 哈哈 看看 ES6 之前的 JS 那才叫群魔乱舞的感觉 直接写规范 TS 是正确选择😉
celerysoft   
如果 len(self.ups) == 0 ,for 循环没有执行,那 ch 就没有赋值,并且直接在 self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) 这里调用了,所谓的「局部变量 ch 可能在赋值之前使用」说的就是这种情况吧
不过我有点不理解你吐槽的点,你是觉得 ch 应该在没有声明的情况下就能使用吗?还是说不习惯 Python 没有专门的词用于变量声明
enchilada2020   
@celerysoft 他吐槽的是 Python 没块作用域…
您需要登录后才可以回帖 登录 | 立即注册

返回顶部