Python生成器让我困惑

2024-05-23 18:49:22 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么会这样?我弄糊涂了。 在第一种情况下,我通过列表理解来定义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]

Tags: theintest列表foroutputlen定义
1条回答
网友
1楼 · 发布于 2024-05-23 18:49:22

您看到的结果是由生成器中的名称绑定正式导致的,如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的元素

现在让我们看看生成器

chunked_test_list = (test_list[x: x + step] for x in range(0, len(test_list), step))

立即计算循环表达式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不会得到反弹,循环完成时不会发生冲突

相关问题 更多 >