python如何“知道”如何处理“in”关键字?

我有点困惑python中的“in”关键字。

如果我拿一个元组的样本列表:

data = [ (5, 1, 9.8385465), (10, 1, 8.2087544), (15, 1, 7.8788187), (20, 1, 7.5751283) ] 

我可以做两个不同的“for-in”循环,并得到不同的结果:

 for G,W,V in data: print G,W,V 

这将打印每行的一组值,例如5, 1, 9.8385465

 for i in data: print i 

这会打印整个元组,例如(5, 1, 9.8385465)

python如何“知道”,通过提供一个variables我想分配一个variables的元组,并通过提供三个variables,我想分配每个值从元组的variables之一?

根据复合对账单文件 :

每个项目依次使用分配的标准规则分配给目标列表…

这些“标准规则”在转让声明文件中 ,具体为:

将对象分配给目标列表的recursion定义如下。

  • 如果目标列表是单个目标:将对象分配给该目标。

  • 如果目标列表是以逗号分隔的目标列表:对象必须是与目标列表中的目标相同数目的项目,并且项目从左到右分配给相应的目标。

所以,这种不同的行为,取决于你是分配给单个目标还是分配给目标列表,这个行为被直接引入到Python的基本原理中,并且适用于任何使用赋值的地方。

这不是in关键字的特征,而是Python语言的特征。 同样的作品与分配。

 x = (1, 2, 3) print(x) >>> (1, 2, 3) a, b, c = (1, 2, 3) print(a) >>> 1 print(b) >>> 2 print(c) >>> 3 

所以为了回答你的问题,Python更多地知道如何处理分配:

  • 分配一个元组到一个variables,或者
  • 将一个元组分配给与元组中项目数相等的variables

这就是所谓的元组拆包 ,与in关键字无关。

for循环返回单个事物(在这种情况下是一个tuple ),然后该tuple被分配到第二种情况下的单个项目或第一种情况下的多个项目。

如果您尝试指定不正确的variables数量:

 for G,W in data: print G,W Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack 

迭代器在理论上返回一个单一的项目( for a in b语法)。

编译器知道,如果你指定了多于一个的东西,那么一个返回值本身就是可迭代的,并且包含与你的variables列表相同数量的项目。 它会抛出一个运行时错误,如果你有for a, b in cfor a, b in c的元素不包含确切的两个项目。

所以总之“知道”是因为这是你所说的。 它会在运行时爆炸,如果你撒谎…