我对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如何“知道”通过提供一个变量我想将元组分配给变量,并且通过提供三个变量,我想将元组中的每个值分配给其中一个变量?
答案 0 :(得分:36)
根据the for
compound statement documentation:
依次使用标准将每个项目分配到目标列表 作业规则......
那些“标准规则”位于the assignment statement documentation,具体为:
将对象分配给目标列表以递归方式定义为 如下:
如果目标列表是单个目标:将对象分配给该目标。
如果目标列表是以逗号分隔的目标列表:对象必须是具有与目标相同数量的项目的可迭代项 在目标列表中,项目从左到右分配到 相应的目标。
因此,根据您是分配给单个目标还是目标列表,这种不同的行为会直接进入Python的基础,并适用于使用任务的任何位置。
答案 1 :(得分:23)
这不是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知道如何处理任务时更是如此:
答案 2 :(得分:12)
它名为tuple unpacking,与in
关键字无关。
for
循环返回单个内容(在这种情况下为tuple
),然后将tuple
分配给第二个案例中的单个项目,或多个项目在第一种情况下。
如果您尝试指定不正确的变量数:
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
答案 3 :(得分:3)
迭代器在概念上返回单个项(for a in b
语法)。
编译器知道如果为a
指定多个内容,则返回的一个值本身必须是可迭代的,并且包含与变量列表相同数量的项。如果您有for a, b in c
并且c
的元素不包含恰好两个项目,则会抛出运行时错误。
简而言之,它“知道”,因为这就是你所说的。如果你撒谎,它会在运行时爆炸......