假设我有一个列表l和一个线程t1l永远迭代:
while True:
for i in l:
#do something
Run Code Online (Sandbox Code Playgroud)
和另一个线程t2随机修改或删除成员l.
删除后会发生什么?难道T1检测,在当前的循环?
更新:
冻结我的意思是t1得到一份副本l.t2可以l肯定修改
引用文档或简单但有说服力的代码片段是受欢迎的.
不会.列表没有被冻结 - 你的迭代器在提出异常的意义上不会"破坏".相反,它将继续在列表中前进,结果可能令人惊讶.
考虑一下这段代码(这里是ideone的片段:http://ideone.com/0iMao ):
l = list(range(10))
for i in l:
print i
try:
del l[i]
except (RuntimeError,IndexError), e:
print e
print l
Run Code Online (Sandbox Code Playgroud)
它产生这个输出:
0
2
4
5
7
list assignment index out of range
9
list assignment index out of range
[1, 2, 4, 5, 7, 9]
Run Code Online (Sandbox Code Playgroud)
这可能不是你想要或期望的,虽然它显然是明确定义的:http://docs.python.org/reference/compound_stmts.html#the-for-statement.
相反,您可以锁定列表,也可以复制一份.请注意,iter(l)内部不会复制,并且与直接迭代列表具有相同的效果.
| 归档时间: |
|
| 查看次数: |
723 次 |
| 最近记录: |