В этой строке вы создаете итератор:
x = zip(a, b)
Внутри оператора print вы конвертируете итератор в кортеж.Этот кортеж состоит из 3 элементов.Это исчерпывает итератор, и каждый раз, когда вы вызываете его позже, он не возвращает никаких дополнительных элементов.
Следовательно, после создания tup
ваш итератор не возвращает элемент.Следовательно, у вас есть кортеж с длиной 0. И, конечно, это вызовет исключение, когда вы попытаетесь получить доступ к элементу с индексом 1.
Для тестирования рассмотрите следующее:
a = ("John", "Charles", "Mike")
b = ("Jenny", "Christy", "Monica", "Vicky")
x = zip(a, b)
tup1 = tuple(x)
tup2 = tuple(x)
print(tup1)
print(tup2)
Это даст вам следующий результат:
(('John', 'Jenny'), ('Charles', 'Christy'), ('Mike', 'Monica'))
()
Это в основном то, что вы делаете, когда дважды создаете кортеж из итератора.