2016-04-14 62 views
1

下面是設置:不理解這是什麼東西在Python中與切片

words = ['cat', 'window', 'defenestrate'] 
    for w in words: 
     print(w, len(w)) 

然後我進入這個:

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

我不明白在insert(0, w) 0是 做。當我用另一個號碼 更改它時,輸出保持不變。

最後輸入/輸出:

>>> words 
['defenestrate', 'cat', 'window', 'defenestrate'] 
+2

你爲什麼說輸出保持不變?它不 –

+1

有趣的是,沒有任何答案能夠解決切片問題。要麼您的問題不清楚要求提供這些信息,要麼標題具有誤導性。 – jpmc26

回答

0

(0, w)0是其中單詞(w)將被插入的索引。

因此,您的代碼基本上遍歷列表,並在列表的開頭放置任何長度大於6個字符的單詞。

對我而言,更改索引的工作方式與您所期望的一樣。

的索引1

In [1]: words = ['cat', 'window', 'defenestrate'] 

In [2]: for w in words[:]: 
    if len(w) > 6: 
     words.insert(1, w) 
    ...: 

In [3]: words 
Out[3]: ['cat', 'defenestrate', 'window', 'defenestrate'] 

指數0

In [1]: words = ['cat', 'window', 'defenestrate'] 

In [2]: for w in words[:]: 
    ...:  if len(w) > 6: 
    ...:   words.insert(0, w) 
    ...: 

In [3]: words 
Out[3]: ['defenestrate', 'cat', 'window', 'defenestrate'] 

指數3

In [1]: words = ['cat', 'window', 'defenestrate'] 

In [2]: for w in words[:]: 
    if len(w) > 6: 
     words.insert(3, w) 
    ...: 

In [3]: words 
Out[3]: ['cat', 'window', 'defenestrate', 'defenestrate'] 
3

的第一個參數insert什麼指標告訴insert放置在列表中的新項目。由於您只有一個長度超過6個字符的單詞,因此您發佈的代碼將defenestrate添加到現有列表的開頭。

docs

list.insert(I,X)

在給定的位置插入一個項目。第一個參數是要插入的元素的索引,所以a.insert(0,x)插入到列表的前面,而a.insert(len(a),x)等價於a.append( X)。

0

改變插入位置應該改變輸出,如下所示。插入位置(如你所說的'0')在列表中要插入的索引之前告訴。

>>> words = ['cat', 'window', 'defenestrate'] 
>>> for w in words[:]: 
... if len(w) > 6: 
...  words.insert(0,w) 
... 
>>> words 
['defenestrate', 'cat', 'window', 'defenestrate'] 
>>> words = ['cat', 'window', 'defenestrate'] 
>>> for w in words[:]: 
... if len(w) > 6: 
...  words.insert(2,w) 
... 
>>> words 
['cat', 'window', 'defenestrate', 'defenestrate'] 
1

我不明白插入(0,w)中的0在做什麼。當我用另一個數字改變它時,輸出保持不變。

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

我以前就遇到蟒蛇教程這個問題,這裏是我的解釋。

讓我們退一步,看看上下文:

這個例子是從Python教程第4章,但同樣教程的代碼行,你都在質疑引用第5.1章。

列表上的「插入」方法是在這裏: https://docs.python.org/2.7/tutorial/datastructures.html

的困惑是可以理解的,如果你正在做的教程「爲了」,其中,當然,你是應該的,那麼你不熟悉的那個代碼行。跳轉到第5.1章,看到這個:

list.insert(i,x)在給定位置插入一個項目。第一個參數 是之前插入的元素的索引,因此 a.insert(0,x)插入列表的前面,並且a.insert(len(a), x)等同於.append(X)。


筆者試圖表明的一點是,你要修改循環中的列表之前將列表的副本,或「壞事」™可能發生。

參見:Thou Shalt Not Modify A List During Iteration

如果不復制列表,循環永遠無法完成......試試這個:

>>> for w in words: # Loop over the list, and modify it while looping 
...  if len(w) > 6: 
...   words.insert(0, w) 
... 

你將會等待,直到你耗盡內存,但你收到此:

['defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'defenestrate', 'cat', 'window', 'defenestrate'] 

原因是這樣的:

  1. for循環得到 'W' 從words[0]: '貓'
    • len('cat') > 6false - 繼續
  2. for循環得到 'W' 從words[1]: '窗口'
    • len('window') > 6false - 繼續
  3. for循環從獲得'w': 'defenestrate'
    • len('defenstrate') > 6true
    • 插入...
    • words現在['defenestrate', 'cat', 'window', 'defenestrate']
  4. for循環得到 'W' 從words[3]: 'defenstrate'
    • len('defenstrate') > 6true
    • 插入...
    • words現在['defenstrate, 'defenestrate', 'cat', 'window', 'defenestrate']
  5. for循環得到 'W' 從words[4]: 'defenstrate'

...持續無限。

當複製列表中,出現這種情況:

  • for循環得到從words[3]
    • 加註異常COPY 'W':IndexError(因爲複製OF words只有3項長)
    • for循環通過終止循環來處理異常。
  • 你永遠不會改變的 '單詞' 名單的副本。
    你正在改變原來的單詞列表。

    副本是匿名。它是一個只用於控制循環的變量,只在循環內部可用。當循環終止時它會消失。

    相關問題