Как Python формирует sys.argv и почему вывод будет "3 True"
@python_quizРазберем этот квиз
Код из квиза:

Кратко: при запуске, приведённом в комментарии, вывод программы будет

Ниже — подробное объяснение, разбор вариантов и примеры, которые помогут понять, почему именно так.
Почему len(sys.argv) == 3
- sys.argv — список аргументов командной строки.
- По соглашению, первый элемент sys.argv[0] — имя исполняемого скрипта.
- В нашем запуске аргументы командной строки:
script.py,one,two three.
- Последний аргумент заключён в кавычки, поэтому оболочка передаёт его как один элемент (с пробелом внутри).
- Следовательно, sys.argv = ['script.py', 'one', 'two three'] → len == 3.
Чтобы убедиться, можно вывести сам список:

Пример запуска:

Почему sys.argv[0] == __file__ даёт True
__file__— имя файла модуля (обычно путь, указанный при запуске).- При стандартного запуска
python script.pyобычно оба значения дают одинаковую строку (например, 'script.py' или './script.py'), поэтому сравнение равенства готово вернуть True. - Заметьте: это сравнение строчное — если один путь содержит префикс (
./script.py) или абсолютный путь, а другой — относительный, равенство будет False, хотя это тот же файл.
Для диагностики полезно смотреть repr() или полные строки:

Разбор всех вариантов ответов и когда они возможны
В квизе перечислены четыре возможных вывода: "3 True", "3 False", "4 True", "4 False". Вот когда каждый из них может появиться.
- "3 True"
- Происходит при запуске python script.py one "two three" в типичной оболочке.
- Кавычки объединяют two three в один аргумент → len == 3.
- sys.argv[0] и __file__ совпадают по строковому представлению → True.
- "3 False"
- Тоже будет len == 3 (кавычки сохраняют two three в одном элементе).
- Но sys.argv[0] отличается от __file__ по строке, например:
- Запуск через полный путь: python ./script.py one "two three", __file__ может быть 'script.py', а sys.argv[0] — './script.py' (или наоборот).
- Запуск из среды, где sys.argv[0] изменён (shortcut/обёртка), или изменения пути в окружении.
- В таких случаях результат сравнения — False.
- "4 True"
- len == 4 получится, если кавычки убрать и передать two и three как отдельные аргументы:
- python script.py one two three → sys.argv = ['script.py', 'one', 'two', 'three'] → len == 4.
- При этом sys.argv[0] и __file__ могут совпадать (обычный запуск), поэтому сравнение вернёт True.
- "4 False"
- len == 4 как в предыдущем случае (нет объединяющих кавычек).
- sys.argv[0] и __file__ отличаются по строке — например, из-за различий в путях или особенностей запуска — тогда сравнение даст False.
Практические советы
- Если вам важно сравнивать путь до исполняемого файла, используйте нормализацию путей:

- Для отладки выводите repr() значений, чтобы увидеть точные строки и возможные префиксы (
./, абсолютный путь и т.д.). - Помните, что поведение может отличаться при запуске через
python -m, через zip/установленные пакеты, в IDE или при упаковке приложения (например, pyinstaller).
Вывод
При запуске python script.py one "two three" аргументы будут ['script.py', 'one', 'two three'], поэтому длина списка — 3. При типичном запуске sys.argv[0] и __file__ равны по строковому представлению, поэтому сравнение даёт True. Возможны и другие комбинации результатов при изменении кавычек в командной строке или различий в представлении путей.