TypeError против ValueError при попытке распаковать набор
Почему следующие два фрагмента кода приводят к различным ошибкам? Я понимаю, что строки являются итеративными, но я не понимаю, почему это имело бы значение здесь, так как набор - это объект, который повторяется.
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
2 ответа
Строка также является последовательностью; Вы можете распаковать строку в отдельные символы:
>>> 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
но знайте, что наборы не имеют фиксированного порядка (как словари), и в каком порядке присваиваются значения, зависит от точной истории вставок и удалений из набора.
Ваш for
цикл, возможно, идет глубже, чем вы ожидаете. Вы пытаетесь распаковать отдельные элементы набора, а не сам набор. В первом примере член 1
а второй член a
, Ни один из них не имеет двух значений.
То, что вы, возможно, хотите one, two = s
,
Вы также можете узнать это, написав:
>>> s = set([1, 2])
>>> for one_two in s:
... print one_two
1
2