You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch词嵌入教程n-grams代码变量i未初始化仍可运行疑问

问题解答

你对这段代码的语法误解来源于混淆了Python普通for循环语句和列表推导式的语法规则,这段代码是完全合法的Python语法,具体解释如下:

1. 为什么for循环没有冒号和单独的循环体?

你看到的不是普通的for循环语句,是Python内置的列表推导式语法,专门用来快速生成列表,基础语法结构为:

[每次循环的返回值 for 变量 in 可迭代对象]

这种语法不需要在for后面加冒号,也不需要单独缩进写循环体,[]内写在for前面的部分就是每次循环要收集到最终列表里的内容。
举个简单的例子对比:
普通for循环写法生成1-10的平方列表:

squares = []
for i in range(1, 11):
    squares.append(i ** 2)

等价的列表推导式写法:

squares = [i ** 2 for i in range(1, 11)]

你贴的代码里外层的[]和末尾的for i in ...完全符合这个结构,写法是合法的。

2. 为什么变量i出现在引用位置之后?

列表推导式的代码书写顺序和执行顺序不一样:

  • 书写顺序:[返回值(用到变量) for 变量 in 可迭代对象]
  • 执行顺序:先遍历for后面的可迭代对象拿到每个变量值,再代入前面的返回值逻辑计算,把结果收集到列表中
    所以你看到的写在前面的test_sentence[i]、内层列表生成式里的i,实际上执行的时候已经从后面的for i in range(CONTEXT_SIZE, len(test_sentence))拿到了对应的值,不存在未初始化的问题。

3. 这段代码的实际逻辑

这段代码的作用是生成n-gram训练样本,每个样本为(上下文词列表, 目标词)的元组:

  • CONTEXT_SIZE是取目标词前面多少个词作为上下文
  • 遍历的时候目标词的位置i从CONTEXT_SIZE开始,保证前面有足够多的上下文词
  • 内层列表推导式每次取i前面的CONTEXT_SIZE个词组成上下文列表

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:06:04