我刚刚浏览了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:
但是当我这样做时,这是一个无休止的循环,为什么?
答案 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)