【发布时间】:2020-06-21 11:52:00
【问题描述】:
我正在尝试在参数空间中搜索一个好的模型。在我的代码中,我正在执行以下操作:
configurations = [None] * 9
index = 0
for param1 in range(3):
for param2 in range (3):
#call constructor
configurations[index] = Configuration(param1, param2)
index = index + 1
return configurations
然后我在其他地方使用这个数组来构建模型。 但是,由于某种原因,它不会填充数组。访问索引 3 或更高时出现错误。检查显示这些索引处的数组仍然是“无”。在调试时,我在代码中添加了一条打印语句:
configurations = [None] * 9
index = 0
for param1 in range(3):
for param2 in range (3):
#call constructor
configurations[index] = Configuration(param1, param2)
index = index + 1
for x in configurations:
print(x.param1)
return configurations
令我惊讶的是,我的代码现在运行顺利。数组完全填满。如果我注释掉这两行:错误。取消注释:它再次工作。
这里发生了什么?为什么 print 语句会改变我的程序的行为?这是通过打印值来避免的过度活跃的 GC 吗?
【问题讨论】:
-
“类似于以下内容” - 你能详细说明一下吗?是否有可能在您的原始代码中,您在某处有一个生成器?生成器是惰性求值的,因此只有在您对其进行迭代时,才会计算出真正的值。
-
这很有趣,但我直接在 for 循环中调用了构造函数。我将编辑帖子以反映这一点。
-
您可以尝试在双循环之前打印
configurations,然后在它之后(但在打印循环之前)?并显示打印结果? -
我发现了这个错误。最后一个 return 语句用 Tab 缩进,但我使用了 4 个空格。这导致它跳过最外层的 for 循环。 print 语句以某种方式阻止了这一点。将制表符更改为空格消除了对打印语句的需要。难以置信。
标签: python arrays debugging nonetype