我开始循环并在其中,如果我不喜欢其中的值,我会arr删除不适合的部分
for i in range(len(arr)):
if i == some:
arr.pop(i)
然后事实证明它len(arr)会变1小,下次i它会从旧的那里获取值len(arr),但是它已经改变了,结果你会得到一个错误
列表索引超出范围
是否有必要从i它停止的同一个循环重新开始,或者以某种方式使循环不同?
我开始循环并在其中,如果我不喜欢其中的值,我会arr删除不适合的部分
for i in range(len(arr)):
if i == some:
arr.pop(i)
然后事实证明它len(arr)会变1小,下次i它会从旧的那里获取值len(arr),但是它已经改变了,结果你会得到一个错误
列表索引超出范围
是否有必要从i它停止的同一个循环重新开始,或者以某种方式使循环不同?
首先,不要通过基于列表长度创建范围来遍历列表。您可以简单地:
其次,正如我在上一个问题中所写,您无法更改正在迭代的列表。您可以维护一个单独的失败套接字列表,并在循环后将其删除。最后,在您的情况下,最好使用集合而不是列表。总结所写的一切:
更新:根据错误判断
RuntimeError: Set changed size during iteration,当循环本身中的集合没有变化时,另一个线程会改变它。因此,对于迭代,值得创建一个副本,并阻止全局变量的更改:不要忘记在将元素添加到集合的位置添加相同的锁。
你需要隔离你的循环,例如通过将它包含在一个函数中:
但是你要注意这样一个函数会改变传递给它的列表,这会导致数据丢失。为避免这种情况,您可以使用生成器表达式,它在处理大型列表时可以节省大量内存并按条件创建新列表: