示例1
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
如何知道何时解包它返回的值?
答案 0 :(得分:11)
enumerate()
对解包没有任何了解。执行此操作的是for
语句。
target
语句的for
部分就像常规赋值一样,您可以命名多个目标,右侧值应该是具有相同数量元素的序列。 enumerate()
总是生成一个包含两个元素的元组;你的第一个for
循环有两个目标要解压缩,第二个只有一个目标。
原则与将元组分配给两个名称的原理相同:
i, v = (0, 'a')
VS。
x = (0, 'a')
请参阅for
statement documentation:
依次使用标准分配规则
将每个项目分配到目标列表
以及assignment statements documentation,它解释了目标列表的分配规则:
将对象分配给目标列表按递归方式定义如下。
- 如果目标列表是单个目标:该对象将分配给该目标。
- 如果目标列表是以逗号分隔的目标列表:对象必须是与目标列表中的目标具有相同项目数的可迭代对象,并且项目将从左到右分配到相应的目标。
当您使用 for x in
时,您只有一个目标,并为其分配了(0, 'a')
元组。当您使用for i, v in
时,您有一个以逗号分隔的目标列表,该元组是一个可迭代的项,其数量与目标相同,因此0
绑定到i
和{{ 1}}绑定到'a'
。
答案 1 :(得分:3)
这称为元组解包,也适用于其他情况,例如
a, b = (1, 2) # a = 1, b = 2
c = (1, 2) # c = (1, 2)
示例中的for
只需解压缩enumerate
语句的元组。