for循环中元组功能的说明

时间:2020-06-09 17:12:21

标签: python for-loop tuples

如果元组是可迭代的,那么以下代码为什么会导致错误? 我已经读过很多关于此的主题,但我听不懂。

tp1 = (5,7) 
for i,j in tp1:
    print(i,j)

3 个答案:

答案 0 :(得分:3)

如果元组是可迭代的,为什么以下代码会导致错误?

因为for i, j in (5, 7, ..., n)本质上等同于:

i, j = 5
i, j = 7
...
i, j = n

并且右边的结果int是不可迭代的。您不能进一步“解包” *元组的每个元素,因为它是单个整数。

您可以做的是更直接的分配:

tp1 = (5, 7)
i, j = tp1

如果元组的每个元素都是可迭代的,则当前使用的语法将适用,例如:

>>> tp2 = (['a', 5], ['b', 6])
>>> for i, j in tp2: print('%s -> %d' % (i, j))
... 
a -> 5
b -> 6

*从评论中:您能给我解释一下短语“您不能进一步“解包”元组的每个元素,因为它是单个整数”的意思吗?

拆包是将右侧物体的多个部分扩展或提取为左侧物体的概念。 Unpacking, extended unpacking, and nested extended unpacking全面介绍了拆箱过程。 PEP 3132中还指定了unpacking syntax的某些扩展形式。

答案 1 :(得分:3)

当您使用for i,j in tp1:语法时,Python期望该项目是一个可迭代的可迭代对象,可以将其拆包为变量i和j。在这种情况下,当您遍历item时,item的各个成员都是int的,无法解压缩

如果要打开元组中的项目包装,则应这样操作:

for i in tp1:
    print(i)

,并且如果您希望通过这种方式进行迭代,则需要元组或元组或列表中的列表 (即内部可迭代的任何可迭代对象)

a = [(1,2), (3,4)] 
for i, j in a:  # This unpacks the tuple's contents into i and j as you're iterating over a
    print(i, j)

希望对您有帮助

答案 2 :(得分:1)

您的for循环正试图从元组的每个元素中解开元组。您可以改为:

for i in tp1:
    print i

或者您可以这样做:

i, j = tpl
print(i, j)

,但是只有当您有一个元组元组(例如((5, 7), (9, 11)))时,将两者结合才有意义。