2016-06-09 181 views
1

它已经5个小时试图找到问题,但无法确定为什么循环for fn in L运行无限。for循环运行无限python

L=[] 
N=int(raw_input()) 
for i in range(0,N): 
    L.append(list(raw_input().split())) 
print L 

for fn in L: 
    if 'insert'==fn[0]: 
     L.insert(int(fn[1]),int(fn[2])) 
    elif 'append'==fn[0]: 
     L.append(int(fn[1])) 
    elif 'remove'==fn[0]: 
     L.remove(int(fn[1])) 
    elif 'pop'==fn[0]: 
     L.pop(int(fn[1])) 
    elif 'index'==fn[0]: 
     L.index(int(fn[1])) 
    elif 'count'==fn[0]: 
     L.count(int(fn[1])) 
    elif 'sort'==fn[0]: 
     L.sort()  
    elif 'reverse'==fn[0]: 
     L.reverse() 
    else : 
     print L 

输入提供的名单:

12 
insert 0 5 
insert 1 10 
insert 0 6 
print 
remove 6 
append 9 
append 1 
sort 
print 
pop 
reverse 
print 
+0

什么输入你给它? – mgilson

+0

@mgilson:在问题中添加了输入 –

+0

哪些for for循环在for循环中?我看到两个没有嵌套显式循环。 – Matthias

回答

7

变异您在回路列表。结果将是非常不可预测的。您可以改为迭代的列表中的一个片段:

for fn in L[:]: 
    # your code here 
    pass 

这样,当浅拷贝(切片)的项目是疲惫的循环终止。

+0

感谢您的回答。什么是切片清单? –

+0

这是一个快捷方式,一个切片([:])没有边界,所以列表的副本作为切片列表创建一个新的列表。 https://stackoverflow.com/questions/509211/explain-pythons-slice-notation – Khertan

+0

@代码僧侣在这种情况下:原始列表的临时浅表副本。阅读更多[这里](https://ramisayar.com/hidden-features-in-python-slicing-and-sliding/) –

2

您可以在迭代列表元素的同时插入/移除元素。您还可以通过反转列表来更改列表。两者都是迭代过程中不允许的对列表进行的变异操作。在这种情况下行为是未指定的。

for fn in L: 
    if ...: 
     L.insert(...) 
1

您变异用于循环的对象......和更好的你扭转这种局面:对扭转< - 逆转 - >反向< - 逆转 - >

:对