Python在print()之后跳过循环

Python在print()之后跳过循环,python,for-loop,itertools,Python,For Loop,Itertools,我正在调试编写代码的一部分,因此我使用大量调用来打印以检查变量的值。我遇到过一种情况,当打印变量时,会导致Python跳过for循环 我创建一个列表,然后使用itertools创建该列表的组合,然后对它们进行迭代。 如果我像上面那样在类中调用a_函数,我不会得到打印的结果。没有错误发生。解释器不进入循环 (...) ------------- [[2], range(0, 1), range(0, 1)] [(2, 0, 0)] ------------- [range(0, 1), [2],

我正在调试编写代码的一部分,因此我使用大量调用来打印以检查变量的值。我遇到过一种情况,当打印变量时,会导致Python跳过for循环

我创建一个列表,然后使用itertools创建该列表的组合,然后对它们进行迭代。 如果我像上面那样在类中调用a_函数,我不会得到打印的结果。没有错误发生。解释器不进入循环

(...)
-------------
[[2], range(0, 1), range(0, 1)]
[(2, 0, 0)]
-------------
[range(0, 1), [2], range(0, 1)]
[(0, 2, 0)]
(...)
但是如果我注释掉printlistnew\u层,那么for循环被执行,我得到了一个由其他函数引起的错误,这个函数引起了一些错误

listnew\u层不会更改new\u层对象本身,只会创建一个列表并将其传递给print函数,是吗?

问题在于itertools.product返回一个生成器

当您调用printlistnew_layer时,您正在从生成器构建一个列表,但不要将对该列表的引用保存在任何位置

生成器本身将在转换为列表后耗尽,因为listsome_生成器调用uuu next_uuu或next,这取决于该生成器上的Python版本,直到它引发StopIteration

因为现在您将有一个从生成器创建的列表的引用。

问题是itertools.product返回一个生成器

当您调用printlistnew_layer时,您正在从生成器构建一个列表,但不要将对该列表的引用保存在任何位置

生成器本身将在转换为列表后耗尽,因为listsome_生成器调用uuu next_uuu或next,这取决于该生成器上的Python版本,直到它引发StopIteration


因为现在您将有一个对从生成器创建的列表的引用。

为什么在函数体中有一个self,而在函数的参数列表中没有?只需在第一次调用后的行中放置另一个printlistnew_层,您就会看到它失败的原因。打印不是问题,列表是问题。itertools.product是一个生成器,当您使用它上面的列表时,您已经耗尽了迭代器。改为在列表上做一个标记。@cdarke-你把它弄坏了!我想在不泄露的情况下暗示这个事实。但你完全正确-@姆塞尔特:我在写评论的时候正在和医生核对我的评论,所以我错过了你的评论。抱歉破坏了你的乐趣!为什么在函数体中有一个self,而在函数的参数列表中没有呢?只要在第一次调用后的行中放置另一个printlistnew_层,您就会看到它失败的原因。打印不是问题,列表是问题。itertools.product是一个生成器,当您使用它上面的列表时,您已经耗尽了迭代器。改为在列表上做一个标记。@cdarke-你把它弄坏了!我想在不泄露的情况下暗示这个事实。但你完全正确-@姆塞尔特:我在写评论的时候正在和医生核对我的评论,所以我错过了你的评论。抱歉破坏了你的乐趣!你的建议是可行的,但它与在他的案例中使用itertools完全矛盾,因为你将结果保存在只应保留生成器的位置。这里的教训应该是:在循环之前不要调试循环变量,在loop@MSeifert是的,据我所知,OP正在使用调用打印以进行调试。我建议在程序正确测试之前使用我的修复程序。然后,在删除打印语句后,不再需要将生成器转换为列表,如果您只是按原样使用生成器,程序的内存效率将更高。您的建议有效,但与他使用itertools的情况完全相反,因为您将结果保存在只应保留生成器的位置。这里的教训应该是:在循环之前不要调试循环变量,在loop@MSeifert是的,据我所知,OP正在使用调用打印以进行调试。我建议在程序正确测试之前使用我的修复程序。然后,在删除print语句后,不再需要将生成器转换为列表,如果按原样使用生成器,程序的内存效率将更高。
(...)
-------------
[[2], range(0, 1), range(0, 1)]
[(2, 0, 0)]
-------------
[range(0, 1), [2], range(0, 1)]
[(0, 2, 0)]
(...)
-------------
[[2], range(0, 1), range(0, 1)]
for
[2, 0, 0]
Traceback (most recent call last):
(...)
>>> from itertools import product
>>> new_layer = product([1,2,3], [4,5,6])
>>> new_layer
<itertools.product object at 0x7f46e90349b0>
>>> print(list(new_layer))
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
>>> print(list(new_layer))
[]
new_layer = list(itr.product(*new_layer))
print(new_layer)