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