如果元组是可迭代的,那么以下代码为什么会导致错误? 我已经读过很多关于此的主题,但我听不懂。
tp1 = (5,7)
for i,j in tp1:
print(i,j)
答案 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))
)时,将两者结合才有意义。