【发布时间】:2020-12-03 18:43:13
【问题描述】:
我试图弄清楚为什么我的嵌套列表理解不起作用。代码:
def myzip(*args):
try:
x = [iter(i) for i in [*args]]
while True:
# for i in range(5):
yield [next(ii) for ii in x]
# I want to know why the commented line below won't work
# yield [next(ii) for ii in [iter(i) for i in [*args]]]
# or why this outputs [1, 'a']
# return [next(ii) for ii in [iter(i) for i in [*args]]]
except:
pass
def main():
print(list(myzip([1, 2, 3, 4, 5], ['a', 'b', 'c'])))
if __name__ == '__main__':
main()
如果我将[iter(i) for i in [*args]] 分配给x 然后使用此列表理解[next(ii) for ii in x] 一切正常。输出将是:
[[1, 'a'], [2, 'b'], [3, 'c']]
但是如果我尝试省略变量 x 并在一个更大的列表理解(注释行)[next(ii) for ii in [iter(i) for i in [*args]]] 中执行它,它会进入无限循环。如果将无限循环替换为 for 循环(注释行),则输出为:
[[1, 'a'], [1, 'a'], [1, 'a'], [1, 'a'], [1, 'a']]
此外,如果我尝试 return [next(ii) for ii in [iter(i) for i in [*args]]] 它只会返回:
[1, 'a']
谁能告诉我这是为什么?
【问题讨论】:
-
为什么不应该呢?您没有在任何地方保存以前的值,而是在执行全新的列表理解。
-
就像
for i in range(10):和while True: i = next(range(10))的区别 -
第二个每次迭代都会创建一个新的范围对象并从头开始。
-
我不这么认为,因为您不能将
yield放在列表理解中。 -
对单线的痴迷是什么?