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
知道何時解開它返回的值?
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
知道何時解開它返回的值?
enumerate()
對拆箱一無所知。這是這樣的for
聲明。
for
語句的target
部分就像常規分配一樣,您可以命名多個目標,並且右邊的值應該是具有相同數量元素的序列。 enumerate()
總是產生兩個元素的元組;你的第一個for
循環有兩個目標來解開它,第二個只有一個目標。
的原理是一樣的,如果你分配一個元組兩個名字:
i, v = (0, 'a')
與
x = (0, 'a')
而每個產品使用標準分配規則分配到目標列表
以及所述assignment statements documentation,這解釋了分配的規則來指定列表:
一個目的是目標列表的分配被遞歸地定義如下。
- 如果目標列表是單個目標:將對象分配給該目標。
- 如果目標列表是以逗號分隔的目標列表:對象必須是與目標列表中的目標具有相同數量項目的迭代項,並且項目從左到右分配給相應的目標。
當您使用只是for x in
你有一個目標和(0, 'a')
元組被分配給它。當您使用for i, v in
時,您有一個以逗號分隔的目標列表,該元組與迭代目標的項目數相同,因此0
綁定爲i
,而'a'
綁定爲v
。
在教程中也可能引用更簡單但不太嚴謹的解釋,其中IIRC位於元組和序列部分。它可能不會指望你理解什麼是可迭代的,等等(因爲這一切都在本教程的後面)。雖然我猜想對於2.x版本,參考文檔很簡單,可以遵循。 – abarnert 2014-08-27 12:03:21
這稱爲元組拆包,也適用於其他情況,例如,
a, b = (1, 2) # a = 1, b = 2
c = (1, 2) # c = (1, 2)
在您的示例for
只需解壓您的enumerate
聲明的元組。
這與'enumerate'沒有任何關係。 – Maroun 2014-08-27 11:56:06
我用例子看到問題很好的問題,我沒有看到任何理由downvote。如果有人認爲它應該是downvoted,請提到,所以OP可以改善他的問題下次。 – Maroun 2014-08-27 11:56:55
@MarounMaroun:你的評論相當於一個很大的「不!」。也許你可以解釋它的作用?這實際上會有幫助.... – 2014-08-27 12:12:51