gpt4 book ai didi

Python 生成器让我困惑

转载 作者:行者123 更新时间:2023-12-04 16:54:06 25 4
gpt4 key购买 nike

为什么会这样?我越来越糊涂了。
在第一种情况下,我定义了 chunked_test_list通过列表理解。输出符合预期。
但是,在下一种情况下,我定义了 chunked_test_list作为发电机。然后,当我用 for 循环查看它时,只有第一个循环给了我预期的结果,其余的是 EMPTY 列表。我很困惑..
并且,在最后一种情况下,我将变量名从 test_list 更改为至 test_list_1在 for 循环中,然后结果按预期运行。哦,我更糊涂了。

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]

最佳答案

您看到的结果正式由生成器中名称的绑定(bind)引起,如 PEP289 中所述。 .
列表推导chunked_test_list = [test_list[x: x + step] for x in range(0, len(test_list), step)]test_list ,但会立即创建一个切片列表列表。重新绑定(bind)名称 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)通过迭代次数。
同时,生成器循环体, test_list[x: x + step] , 每次外部 for 都会被评估循环调用 next .循环 for test_list in chunked_test_list:有效地执行分配 test_list = gen.next()在每次迭代中。在第一次调用 next 期间, test_list绑定(bind)到它的原始值。您会看到生成器的第一个元素按预期打印。然而,一旦调用返回,名称 test_list绑定(bind)到 next 的结果.由于返回值的长度都不足以支持范围生成的索引,因此您会看到空列表。
当您将生成器中的循环变量重命名为 test_list_1 时, test_list不会反弹,并且循环在没有冲突的情况下完成。

关于Python 生成器让我困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64056877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com