为什么以下两个代码段会产生不同的错误? 我理解字符串是可迭代的,但是我不明白为什么这会在这里重要,因为集合是被迭代的对象。
s = set([1, 2])
for one, two in s:
print one, two
加注
Traceback (most recent call last):
File "asdf.py", line 86, in <module>
for one, two in s:
TypeError: 'int' object is not iterable
s2 = set(['a', 'b'])
for one, two in s2:
print one, two
加注
Traceback (most recent call last):
File "asdf.py", line 90, in <module>
for one, two in s2:
ValueError: need more than 1 value to unpack
答案 0 :(得分:6)
字符串也是一个序列;你可以将字符串解压缩成单独的字符:
>>> a, b = 'cd'
>>> a
'c'
>>> b
'd'
ValueError
被引发,因为长度为1的字符串无法解压缩到两个目标中。
然而,当循环遍历整数序列时,您试图将每个整数值解包为两个目标,并且整数根本不可迭代。这是一个TypeError
,因为这与您尝试解压缩的对象类型直接相关:
>>> a, b = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
将此与字符串,列表,元组,迭代器,生成器等进行比较,这些类型都是 可迭代的类型。
如果您想直接解压缩集,请不要使用for
循环:
>>> a, b = set([1, 2])
>>> a
1
>>> b
2
但确实知道集合没有固定的顺序(就像字典一样),并且分配值的顺序取决于插入和删除集合的确切历史记录。
答案 1 :(得分:2)
您的for
循环可能比您预期的更深。你试图解开集合中的个别成员,而不是集合本身。在第一个示例中,成员是1
,第二个成员是a
。没有两个值。
您可能想要的是one, two = s
。
你也可以写下来找到这个:
>>> s = set([1, 2])
>>> for one_two in s:
... print one_two
1
2