2013-04-22 103 views
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循環,爲什麼?

+1

http://stackoverflow.com/questions/6167238/what-does-in-python-mean http://stackoverflow.com/questions/4947762/python-why-use-list-when- list-refer-to-same-thing – 2013-04-22 17:28:03

+0

你的輸出與你的代碼不匹配 - 對於所有的單詞,「len(w)」都是'3'。 – 2013-04-22 17:31:17

+0

你說得對。我剛剛編輯它。 – Johnny 2013-04-22 17:40:20

回答

7

[:]是指從開始到列表的開頭的範圍內 - 它實質上是複製列表中(我一般主張使用list(...)而不是爲了可讀性,它做同樣的工作,並適用於所有iterables,不僅僅是序列)。

這裏的問題是你在循環時修改列表,這意味着有更多的條目循環,所以它變得無限。

一般來說,修改列表的同時迭代它是不好的想法。相反,考慮一個list comprehension構建一個新的列表。

此代碼以相反的順序放置列表開頭的長度超過六的所有單詞。所以另一種實現方式是:

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

[:]創建副本的列表。該切片獲取所有元素並返回新的列表

如果你遍歷列表本身,並且不斷添加元素,那麼最終會產生無限循環。但是,如果您代之以環路副本,則for循環將看不到正在擴展的原始列表;用於循環的副本不會看到要添加的額外元素。

2

在Python中,您不能迭代列表並從列表中同時刪除元素。 words[:]返回words的副本這樣,您可以在遍歷words[:]時修改words

3

因爲當你使用[:]它會創建一個複製原始列表,而當你忽略它,你遍歷同一個列表,而不是一個副本。

如果您在循環播放列表時修改列表,那麼您只需不斷添加列表並繼續增加,因此循環會繼續。

但是,如果您在修改原始文件的同時通過副本進行循環,則會到達複製和停止的末尾(因爲沒有添加新項目)。

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) 
+0

考慮解釋你的代碼 – Chris 2015-11-21 08:47:50