1

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

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

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:

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

4

5 回答 5

7

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

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

通常,在迭代列表时修改列表是一个主意。相反,考虑使用列表推导来构造一个新列表。

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

words = [w for w in reversed(words) if len(w) > 6] + words
于 2013-04-22T17:27:41.353 回答
4

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

如果您循环遍历列表本身,并不断向其中添加元素,您最终会陷入无限循环。但是如果你循环遍历一个副本,那么for循环不会看到原始列表被扩展;用于循环的副本没有看到添加的额外元素。

于 2013-04-22T17:27:40.657 回答
3

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

如果您在循环时修改列表,那么您只需继续添加它并且它会不断增长,因此您的循环继续。

但是,如果您在遍历副本时修改原始文件,那么您将到达副本的末尾并停止(因为没有添加新项目)。

于 2013-04-22T17:28:15.380 回答
2

在 Python 中,您不能同时遍历一个列表并从该列表中删除元素。 返回That way 您可以在迭代时修改words[:]的副本.wordswordswords[:]

于 2013-04-22T17:28:01.980 回答
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)
于 2015-11-21T06:08:08.437 回答