zip() извлекает по одному элементу из каждой переданной последовательности (или вообще любых итерируемых объектов) и возвращает их все вместе в виде кортежа, делая так до тех пор, пока одна из последовательностей не закончится. Это значит, что конец более длинных последовательностей просто тихо выкидывается и не используется. Поведение абсолютно логичное, существует уже много лет, явно описано в документации, но, к сожалению, оно слишком неочевидное. В ситуации с последовательностями разной длины результат операции может получиться не таким, как ожидается, при этом никаких ошибок не произойдет. Это настолько распространённая проблема, что даже в стандартной библиотеке Python были баги по этому поводу.В Python 3.10 приняли PEP 618, который добавляет в
zip() аргумент strict. В режиме zip(..., strict=True) функция будет контролировать, чтобы все последовательности заканчивались одновременно.Например,
zip([1, 2, 3], [1, 2], strict=True)
зарейзит ошибку ValueError, потому что переданы списки разной длины.По умолчанию
zip() сохранит своё старое поведение.Ждём Python 3.10!
Ссылки:
* PEP 618: https://www.python.org/dev/peps/pep-0618/
* Документация по
zip: https://docs.python.org/3/library/functions.html#zip