一个关于作用域的吐槽

2023-03-15 02:08:00 +08:00
 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 没有语句块的概念

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

知道这个以后我脑海中只有一句话

真的是令人叹为观止

2691 次点击
所在节点    Python
25 条回复
proxytoworld
2023-03-15 10:56:00 +08:00
因为 python 不确定是不是一定进入 for 循环里面赋值(猜测)所以才会报这个错,如果你确保一定会进入的话可以忽略这个,毕竟编译器比较死板
enchilada2020
2023-03-15 11:11:01 +08:00
@proxytoworld 这样做等于在埋坑 半年后你会忘了这个在代码里体现不出来的隐藏默认条件 之后如果因为某种原因这个条件被破坏了 那就是炸弹
raymanr
2023-03-15 11:11:39 +08:00
@enchilada2020 我多年以前自学 js 的时候看到这里都吐了, 但凡变量名写错, 就变成了全局变量真的吐了, 加上其他各类坑问题风骚语法, 以至于很长时间里 javascript 在我眼里就是混乱邪恶的语言代表....... 即便现在好了很多, js 这东西还是让我觉得能不碰就不碰的好
enchilada2020
2023-03-15 11:24:21 +08:00
@raymanr 是很恶心 哈哈 偏偏它成了 Web 领域避不开的语言🤣
whileFalse
2023-03-15 23:43:31 +08:00
这不很正常吗,你 for 循环不一定会跑啊 万一 self.ups 是空数组呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924046

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX