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
Другие вопросы по тегам