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
相关产品推荐
相关产品推荐

