def func(a,b,c):
for x,y,z in a,b,c:
pass
func(((1,2),(1,3)),((1,4),(1,5)),(1,2))
我希望x,y,z
得到值(1,2)
、(1,4)
和1
。相反,我收到一个错误:
ValueError: not enough values to unpack (expected 3, got 2)
您需要压缩列表才能执行这样的 for 循环,而无需遍历传递到func()
中的参数:
def func(a,b,c):
for x,y,z in zip(a,b,c):
pass
func(((1,2),(1,3)),((1,4),(1,5)),(1,2))
否则,for 循环将遍历传递到func
中的每个参数。
a,b,c
是一个括号隐含的元组。它和(a,b,c)
一样.
for x,y,z in (a,b,c):
这个循环不会a
解压缩到x
中,b
解压缩到y
中,c
解压缩到z
中。相反,它有三次迭代。它尝试将a
解压缩到x,y,z
的第一次迭代。下一次迭代解压缩b
,第三次解压缩c
。
a
可以拆包成x,y,z
吗?好吧,a
是一个具有两个元素的元组:(1,2)
和(1,3)
。两个元素不能解压缩为三个变量。所以不,它不能。这就是为什么您会收到一条错误消息"预期 3,得到 2"。
我不知道你打算用这段代码做什么。您可以通过将(a,b,c)
包装在额外的可迭代对象中来修复它。以下任一:
for x,y,z in ((a,b,c),):
for x,y,z in [(a,b,c)]:
或者,如果您希望从三个元组中各有一个元素,请使用zip
同时迭代所有三个元组:
for x,y,z in zip(a,b,c):