问题:
昨天在开发调试过程中发现程序在运行一段时间后会crash,报错信息:RuntimeError: Set changed size during iteration,下面是部分源代码:
for item in set_new:
if (time.time() - item.fetch_time > OUT_TIME):
print('set_new: item time out: <<<<<<<<<<
print(item)
set_result.add(item)
set_new.remove(item)
求助google后,得到一遍文章 :Recursion: how to avoid Python set changed set during iteration RuntimeError
恍然大悟,我怎么能在迭代的时候删除自身的元素~!too stupid~!
解决:
利用set的copy()内置函数,在set集合的引用上迭代,可避免此问题:
for item in set_new.copy():
if (time.time() - item.fetch_time > OUT_TIME):
print('set_new: item time out: <<<<<<<<<<
print(item)
set_result.add(item)
set_new.remove(item)
下面附上copy()用法:
copy()¶
Return a new set with a shallow copy of s.