我有以下代码。
for idx in range(len(networks)):
net_ = networks[idx]
lastId=0
for layerUptID in range(len(net_[1])):
retNet,lastId=cn_.UpdateTwoConvLayers(deepcopy(net_),lastId)
networks.append(retNet)
if(lastId==-1):
break
networks
开头只有一个网。
在运行retNet,lastId=cn_.UpdateTwoConvLayers(deepcopy(net_),lastId)
行之后,我还有6个网并附加到networks
。
因此,在完成此lastId ==-1
之后,请使用first for loop
返回len(networks) is 7
。
对于下一个idx, idx=1
,然后继续。
然后,len(networks)为13。然后返回到first for loop
。
此后,第一个for循环中断。
我期望idx is 2
继续使用,但是会中断。
可能是什么问题?
答案 0 :(得分:1)
如果尝试使用WHILE循环而不是FOR循环,则break语句将检查该循环是否在'networks'集合的最后一项上。 这样,网络长度将在每次循环迭代中计算出
答案 1 :(得分:0)
对于初学者:在要编辑的列表(或数据)上迭代或循环是不明智的做法。编码时请记住这一点。
这意味着,如果您打算编辑要循环播放的内容(在networks
的情况下),那么遍历它的时间将会很糟糕。我建议将其分解为两个代码部分:
第一部分将创建一个新列表,列出您想要的WHILE循环。 第二部分替换了您用来生成所需内容的列表。
可能会出错的另一件事是net_[i]
可能没有为某些i设置,您正在尝试在此处访问它:
for layerUptID in range(len(net_[1])):
如果net_ [1]中没有内容怎么办?
为避免这些错误,通常验证数据是一个很好的起点。如果不为null,则继续,否则,打印错误。
这是我能想到的。希望对您有所帮助。
答案 2 :(得分:0)
如果我正确理解了您的问题,则是您向networks
添加了新元素,即长度增加了networks
,并期望for
循环会吸收这种变化,好吧,让我们看看下面的代码片段
elements = [1]
indices = range(len(elements))
for index in indices:
print('index is', index)
elements.append(2)
print('elements count is', len(elements))
print('indices count is', len(indices))
输出是
index is 0
elements count is 2
indices count is 1
因此,尽管elements
列表的长度已更改,但我们看到的是range
循环中使用的for
对象。发生这种情况是因为len
返回了不可变的int
对象,因此,当您更改list
的长度时,其长度变成了不同的对象,并且range
函数对此更改一无所知。>
最后,我们可以在此处使用while
循环
while networks:
net_ = networks.pop()
lastId = 0
for layerUptID in range(len(net_[1])):
retNet, lastId = cn_.UpdateTwoConvLayers(deepcopy(net_), lastId)
networks.append(retNet)
if lastId == -1:
break