Пробелы не рассматриваются как эквивалент табуляции. Строка с отступом табуляции отличается от строки с 1, 2, 4 или 8 пробелами.
Доказательство контрпримером ( ошибочно или, в лучшем случае, ограничено - табуляция! = 4 пробела ):
x = 1
if x == 1:
^Iprint "fff\n"
print "yyy\n"
^I
показывает TAB . При запуске через Python 2.5 я получаю сообщение об ошибке:
File "xx.py", line 4
print "yyy\n"
^
IndentationError: unindent does not match any outer indentation level
Таким образом, показывая, что в Python 2.5 вкладки не равны пробелам (и, в частности, не равны 4 пробелам).
Упс - неловко; мое доказательство контрпримером показывает, что вкладки не эквивалентны 4 пробелам. Как указывает Алекс Мартелли в комментарии , в Python 2 вкладки эквивалентны 8 пробелам, а адаптация примера с вкладкой и 8 пробелами показывает, что это действительно так.
x = 1
if x != 1:
^Iprint "x is not 1\n"
print "y is unset\n"
В Python 2 этот код работает, ничего не печатая.
В Python 3 правила немного отличаются ( отметил от Антти Хаапала ). Сравните:
Python 2 говорит:
Во-первых, вкладки заменяются (слева направо) на один-восемь пробелов, так что общее количество символов, включая замену, должно быть кратным восьми (это предназначено для того же правила, что и в Unix ). Общее количество пробелов, предшествующих первому непустому символу, затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк, используя обратную косую черту; пробел до первого обратного слеша определяет отступ.
Python 3 говорит:
Вкладки заменяются (слева направо) на один-восемь пробелов, так что общее количество символов до замены включительно умножается на восемь (это должно быть то же правило, которое используется в Unix). Общее количество пробелов, предшествующих первому непустому символу, затем определяет отступ строки. Отступ нельзя разделить на несколько физических строк, используя обратную косую черту; пробел до первого обратного слеша определяет отступ.
(Кроме вводного слова «Первый» они идентичны.)
Python 3 добавляет дополнительный абзац:
Отступы отклоняются как несогласованные, если исходный файл смешивает вкладки и пробелы таким образом, что значение зависит от значения вкладки в пробелах; В этом случае возникает ошибка TabError.
Это означает, что пример TAB против 8 пробелов, который работал в Python 2, сгенерирует TabError в Python 3. Лучше всего - в Python 3 - обеспечить, чтобы последовательность символов составляла отступ в каждой строке блока идентичен. PEP8 говорит: «используйте 4 пробела на уровень отступа». (Стандарты кодирования Google гласят: «используйте 2 пробела».)