2014-08-27 24 views
2

實施例1「enumerate」如何知道何時解開返回的值?

for i, v in enumerate({'a', 'b'}): 
    print(i, v) 

返回

0 a 
1 b 

實施例2

for x in enumerate({'a', 'b'}): 
    print(x) 

返回

(0, 'a') 
(1, 'b') 

但如何enumerate知道何時解開它返回的值?

+5

這與'enumerate'沒有任何關係。 – Maroun 2014-08-27 11:56:06

+3

我用例子看到問題很好的問題,我沒有看到任何理由downvote。如果有人認爲它應該是downvoted,請提到,所以OP可以改善他的問題下次。 – Maroun 2014-08-27 11:56:55

+0

@MarounMaroun:你的評論相當於一個很大的「不!」。也許你可以解釋它的作用?這實際上會有幫助.... – 2014-08-27 12:12:51

回答

11

enumerate()對拆箱一無所知。這是這樣的for聲明。

for語句的target部分就像常規分配一樣,您可以命名多個目標,並且右邊的值應該是具有相同數量元素的序列。 enumerate()總是產生兩個元素的元組;你的第一個for循環有兩個目標來解開它,第二個只有一個目標。

的原理是一樣的,如果你分配一個元組兩個名字:

i, v = (0, 'a') 

x = (0, 'a') 

for statement documentation

而每個產品使用標準分配規則分配到目標列表

以及所述assignment statements documentation,這解釋了分配的規則來指定列表:

一個目的是目標列表的分配被遞歸地定義如下。

  • 如果目標列表是單個目標:將對象分配給該目標。
  • 如果目標列表是以逗號分隔的目標列表:對象必須是與目標列表中的目標具有相同數量項目的迭代項,並且項目從左到右分配給相應的目標。

當您使用只是for x in你有一個目標和(0, 'a')元組被分配給它。當您使用for i, v in時,您有一個以逗號分隔的目標列表,該元組與迭代目標的項目數相同,因此0綁定爲i,而'a'綁定爲v

+0

在教程中也可能引用更簡單但不太嚴謹的解釋,其中IIRC位於元組和序列部分。它可能不會指望你理解什麼是可迭代的,等等(因爲這一切都在本教程的後面)。雖然我猜想對於2.x版本,參考文檔很簡單,可以遵循。 – abarnert 2014-08-27 12:03:21

3

這稱爲元組拆包,也適用於其他情況,例如,

a, b = (1, 2) # a = 1, b = 2 
c = (1, 2)  # c = (1, 2) 

在您的示例for只需解壓您的enumerate聲明的元組。