为什么会这样?我弄糊涂了。
在第一种情况下,我通过列表理解来定义chunked_test_list
。输出与预期一致。
但是,在下一个例子中,我将chunked_test_list
定义为生成器。然后,当我使用for循环查看它时,只有第一个循环给出了预期的结果,其余的是空列表。我弄糊涂了。。
在最后一个例子中,我将for循环中的变量名从test_list
更改为test_list_1
,然后它按预期运行。哦,我更糊涂了
test_list = [1, 2, 3, 4, 5, 6, 7, 8]
step = 2
chunked_test_list = [test_list[x: x + step] for x in range(0, len(test_list), step)]
for test_list in chunked_test_list:
print('test_list', test_list)
# >>>output
# test_list [1, 2]
# test_list [3, 4]
# test_list [5, 6]
# test_list [7, 8]
test_list = [1, 2, 3, 4, 5, 6, 7, 8]
step = 2
chunked_test_list = (test_list[x: x + step] for x in range(0, len(test_list), step)) # GENERATOR
for test_list in chunked_test_list: # the variable name `test_list` is SAME to list above
print('test_list', test_list)
# >>>output
# test_list [1, 2]
# test_list []
# test_list []
# test_list []
test_list = [1, 2, 3, 4, 5, 6, 7, 8]
step = 2
chunked_test_list = (test_list[x: x + step] for x in range(0, len(test_list), step)) # GENERATOR
for test_list_1 in chunked_test_list: # the variable name `test_list` is NOT same to list above
print('test_list_1', test_list_1)
# >>>output
# test_list_1 [1, 2]
# test_list_1 [3, 4]
# test_list_1 [5, 6]
# test_list_1 [7, 8]
您看到的结果是由生成器中的名称绑定正式导致的,如PEP289中所述
列表理解
chunked_test_list = [test_list[x: x + step] for x in range(0, len(test_list), step)]
引用test_list
,但会立即创建切片列表列表。将名称test_list
重新绑定为后续循环变量不会影响列表chunked_test_list
的元素现在让我们看看生成器
立即计算循环表达式
range(0, len(test_list), step)
。一旦行运行,就会创建范围,您可以看到它使用了预期的len(test_list)
迭代次数同时,每次外部
for
循环调用next
时,都会对生成器循环体test_list[x: x + step]
求值。循环for test_list in chunked_test_list:
在每次迭代中有效地执行赋值test_list = gen.next()
。在第一次调用next
期间,test_list
被绑定到其原始值。您可以按预期看到生成器打印的第一个元素。然而,一旦调用返回,名称test_list
就绑定到next
的结果。由于没有一个返回值足够长,无法支持该范围生成的索引,因此会看到空列表将生成器中的循环变量重命名为
test_list_1
时,test_list
不会得到反弹,循环完成时不会发生冲突相关问题 更多 >
编程相关推荐