python在for循环之前冻结列表吗?

one*_*ach 5 python for-loop

假设我有一个列表l和一个线程t1l永远迭代:

while True:
    for i in l:
        #do something
Run Code Online (Sandbox Code Playgroud)

和另一个线程t2随机修改或删除成员l.

删除后会发生什么?难道T1检测,在当前的循环?

更新:

  1. 冻结我的意思是t1得到一份副本l.t2可以l肯定修改

  2. 引用文档或简单但有说服力的代码片段是受欢迎的.

Mar*_*cin 7

不会.列表没有被冻结 - 你的迭代器在提出异常的意义上不会"破坏".相反,它将继续在列表中前进,结果可能令人惊讶.

考虑一下这段代码(这里是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)内部不会复制,并且与直接迭代列表具有相同的效果.