为什么这是一个无休止的循环

时间:2013-04-22 17:24:59

标签: python

我刚刚浏览了python docs教程的循环技术章节,我在这里有一个关于这个男孩的问题:[:]

我了解到它需要字符串的开始和结束索引,所以:

text = "This is text"
text[:] # will return the whole text "This is text" and
tex[:4] # will return "This".

但是当我在这里看到这段代码时......

words = ['cat', 'dog', 'cowcowcow']
for w in words[:]:  # Loop over a slice copy of the entire list.
    if len(w) > 6:
        words.insert(0, w)
print words

输出:

['cowcowcow', 'cat', 'dog', 'cowcowcow']

......我不理解for循环中[:]的含义。我会写

for w in words:

但是当我这样做时,这是一个无休止的循环,为什么?

5 个答案:

答案 0 :(得分:7)

[:]表示从列表的开头到开头的范围 - 它本质上是复制列表(我通常主张使用list(...)代替可读性,它做同样的工作,适用于所有迭代,而不仅仅是序列。)

这里的问题是你在循环时修改列表,这意味着有更多的条目要循环,所以它变得无限。

通常,在迭代时修改列表是的想法。相反,请考虑使用list comprehension来构建新列表。

此代码以相反的顺序在列表的开头放置长度超过6的所有单词。所以另一种实现方式是:

words = [w for w in reversed(words) if len(w) > 6] + words

答案 1 :(得分:4)

[:]创建列表的副本。切片将获取所有元素并返回 new 列表。

如果你遍历列表本身,并继续添加元素,你最终会得到一个无限循环。但是如果你改为循环 copy ,那么for循环将不会看到原始列表被扩展;用于循环的副本没有看到添加的额外元素。

答案 2 :(得分:3)

因为当您使用[:]时,它会创建原始列表的副本,而当您省略它时,您将循环遍历同一个列表,而不是副本。

如果您在循环时修改列表,那么您只需继续添加它就会继续增长,这样您的循环就会继续。

但是,如果您在循环副本时修改原始内容,那么您将到达副本的末尾并停止(因为没有添加任何新项目)。

答案 3 :(得分:2)

在Python中,您无法迭代列表并同时从此列表中删除元素。 words[:]会返回words的副本,这样您就可以在迭代words时修改words[:]

答案 4 :(得分:0)

a=[1,2,3,4,5]
for i in a:
    if i==1 : 
         a.insert(0,i)
# you can see  endless loop . Because : 
i=1 =a[0]   #after first loop  a=[1,1,2,3,4,5]
# The second loop :
i=1 =a[1] # because   a=[1,1,2,3,4,5]
# after second loop  a=[1,1,1,2,3,4,5]
# So , endless loop , with result a=[1,1,1......,2,3,4,5].
#It very easy .
#If you user :
a=[1,2,3,4,5]
for i in a[:] :
 if i==1 : 
     a.insert(0,i)
#It same  : 
a_copy=a
for i in a:
    if i==1
      a_copy.insert(0,i)