怎么"枚举"知道什么时候解压返回的值?

时间:2014-08-27 11:53:12

标签: python iterator

示例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如何知道何时解包它返回的值?

2 个答案:

答案 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语句的元组。