【发布时间】:2016-02-26 09:59:04
【问题描述】:
我正在调试编写代码的部分,所以我使用大量对print 的调用来检查我的变量的值。我遇到了一种情况,当打印一个变量时,Python 会跳过一个 for 循环。
import numpy as np
import itertools as itr
(...)
class myclass():
def a_function_inside_a_class():
print('-------------')
current_size = self.get_current_size()
current_size[dimension] += 1
new_layer = [range(i) for i in current_size]
new_layer[dimension] = [current_size[dimension]]
print(new_layer)
new_layer = itr.product(*new_layer)
print(list(new_layer)) # THIS LINE CAUSES PROBLEMS
for c in new_layer:
print('for')
print(list(c))
(...)
a_function_that_causes_some_error(c)
我创建一个列表,然后使用itertools 创建此列表的组合,然后对其进行迭代。
如果我像上面那样调用a_function_inside_a_class(),我没有打印出for。没有错误发生。解释器没有进入循环。
(...)
-------------
[[2], range(0, 1), range(0, 1)]
[(2, 0, 0)]
-------------
[range(0, 1), [2], range(0, 1)]
[(0, 2, 0)]
(...)
但如果我注释掉#print(list(new_layer)),则执行for循环,我得到一个由其他函数a_function_that_causes_some_error(c)引起的错误。
-------------
[[2], range(0, 1), range(0, 1)]
for
[2, 0, 0]
Traceback (most recent call last):
(...)
list(new_layer) 不会改变new_layer 对象本身,只会创建一个列表并将其传递给print() 函数,是吗?
【问题讨论】:
-
为什么函数体内有
self,但函数的参数列表中没有? -
只需在第一次调用之后的行中添加另一个
print(list(new_layer)),您就会明白它为什么会失败。 -
print不是问题,list()是。itertools.product()是一个生成器,当您在其上使用list()时,您已经耗尽了迭代器。改为在列表中添加for。 -
@cdarke - 你把它宠坏了!我想在不泄露的情况下暗示这个事实。但你完全正确! :-)
-
@MSeifert:我在写文档时正在检查我的评论,所以我错过了你的评论。很抱歉破坏了你的乐趣!