2014-08-27 51 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声明的元组。

相关问题