I have a Python script:
if True:
if False:
print('foo')
print('bar')
However, when I attempt to run my script, Python raises an IndentationError
:
File "script.py", line 4
print('bar')
^
IndentationError: unindent does not match any outer indentation level
I kept playing around with my program, and I was able to produce four errors in total:
IndentationError: unexpected indent
IndentationError: expected an indented block
TabError: inconsistent use of tabs and spaces in indentation
IndentationError: unindent does not match any outer indentation level
What do these errors mean? What am I doing wrong? How can I fix my code?
This is a canonical question intended to cover ordinary causes of IndentationError
in the same place, because the conceptual problem — knowing how to indent and why/where — is the same.
There are a few established questions for certain more specific cases, where the conceptual problem isn't about the indentation per se:
How can I write an empty indented block in Python? for cases where everything is lined up as it should be, except that there was a deliberately empty indented block detected as wrong indentation elsewhere.
Why do I get an IndentationError from a properly indented function (following a "try" with no "except")? for cases caused by a missing except
or finally
block. Note that recent versions of Python report the error more clearly, but older ones misleadingly detect the problem as incorrect indentation of the subsequent code.
Copy-paste into Python interactive interpreter and indentation is not really about getting the indentation right, but about what happens when pasting code into Python's REPL (because it's expecting a single block at a time, manually typed in). However, this commonly results in an IndentationError
being reported.
It's also possible to have logically incorrect indentation that does not cause an error. One common form of this is attaching else:
to a for
or while
loop rather than (as intended) the corresponding if:
. See Else clause on Python while statement
See How to fix Python indentation for more tools and techniques to clean up indentation to conform to standards (even if it already "works"). Keep in mind that tools cannot automatically fix errors for you; they can only help with editing, or apply cosmetic changes that don't affect the meaning.
In Python, indentation is used to delimit blocks of code. This is different from many other languages that use curly braces {}
to delimit blocks such as Java, Javascript, and C. Because of this, Python users must pay close attention to when and how they indent their code because whitespace matters.
When Python encounters a problem with the indentation of your program, it either raises an exception called IndentationError
or TabError
. It's also possible to get a SyntaxError
from incorrect indentation.
The historical reasons for why Python uses indentation vs the arguably more commonly accepted curly braces {}
is outlined in an article of the history of Python by Guido van Rossum - the creator of Python:
Python’s use of indentation comes directly from ABC, but this idea didn’t originate with ABC--it had already been promoted by Donald Knuth and was a well-known concept of programming style. (The occam programming language also used it.) However, ABC’s authors did invent the use of the colon that separates the lead-in clause from the indented block. After early user testing without the colon, it was discovered that the meaning of the indentation was unclear to beginners being taught the first steps of programming. The addition of the colon clarified it significantly: the colon somehow draws attention to what follows and ties the phrases before and after it together in just the right way.
The basic rule for indenting Python code is: Each statement in a basic block must be indented by the same amount.
So technically the following Python program is correct:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
However, as you can probably tell from above, randomly indenting your code makes is extremely hard to read and follow the flow of the program. It's better to be consistent and follow a style.
PEP 8 -- the Python style guide -- says:
Use 4 spaces per indentation level.
That is, each statement that is starting a new block and each subsequent statement in the new block, should be indented four spaces from the current indentation level. Here is the above program indented according to the PEP8 style guide:
def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
Python realizes that some people still prefer tabs over spaces and that legacy code may use tabs rather than spaces, so it allows the use of tabs as indentation. PEP8 touches on this topic:
Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.
Note however the one big caveat is not to use both tabs and spaces for indentation. Doing so can cause all kinds of strange hard to debug indentation errors. Python expands tabs to the next 8th column, but if your editor is set to a tab size of 4 columns, or you you use spaces as well as tabs, you can easily produce indented code that looks fine in your editor, but Python will refuse to run. The Python 3 compiler explicitly rejects any program containing an ambiguous mixture of tabs and spaces, usually by raising a TabError
. However, by default, mixing tabs and spaces is still allowed in Python 2, but it is highly recommended not to use this "feature". Use the -t
and -tt
command line flags to force Python 2 to raise a warning or (preferably) an error respectively. PEP8 also discusses this topic:
Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.
When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!
This error occurs when a statement is unnecessarily indented or its indentation does not match the indentation of former statements in the same block. For example, the first statement in the program below is unnecessarily indented:
>>> print('Hello') # this is indented
File "<stdin>", line 1
print('Hello') # this is indented
^
IndentationError: unexpected indent
In this example, the can_drive = True
line in the if
block does not match the indentation of any former statement:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # incorrectly indented
File "<stdin>", line 3
can_drive = True # incorrectly indented
^
IndentationError: unexpected indent
The fix for this error is to first make sure the problematic line even needs to be indented. For example, the above example using print
can be fixed simply be unindenting the line:
>>> print('Hello') # simply unindent the line
Hello
However, if you are sure the line does need to be indented, the indentation needs to match that of a former statement in the same block. In the second example above using if
, we can fix the error by making sure the line with can_drive = True
is indented at the same level as the former statements in the if
body:
>>> age = 10
>>> can_drive = None
>>>
>>> if age >= 18:
... print('You can drive')
... can_drive = True # indent this line at the same level.
...
(This might also occur as SyntaxError: unexpected EOF while parsing
in Python 3.8 or lower.)
This error occurs when Python sees the 'header' for a compound statement, such as if <condition>:
or while <condition>:
but the compound statement's body or block is never defined. For example in the code below we began an if
statement, but we never define a body for the statement:
>>> if True:
...
File "<stdin>", line 2
^
IndentationError: expected an indented block
In this second example, we began writing a for
loop, but we forget to indent the for
loop body. So Python still expects an indented block for the for
loop body:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
File "<stdin>", line 2
print(name)
^
IndentationError: expected an indented block
Comments don't count as bodies:
>>> if True:
... # TODO
...
File "<stdin>", line 3
^
IndentationError: expected an indented block
The fix for this error is to simply include a body for the compound statement.
As shown above, a common mistake by new users is that they forget to indent the body. If this is the case, make sure each statement meant to be included in the compound statement's body is indented at the same level under the compound statement's beginning. Here is the above example fixed:
>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name) # The for loop body is now correctly indented.
...
sarah
lucy
michael
Another common case is that, for some reason, a user may not want to define an actual body for the compound statement, or the body may be commented out. In this case, the pass
statement can be used. From the documentation:
pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed, for example:
def f(arg): pass # a function that does nothing (yet) class C: pass # a class with no methods (yet)
Here is the above example with the if
statement fixed by using the pass
keyword:
>>> if True:
... pass # We don't want to define a body.
...
>>>
This error occurs when you unindent a statement, but now the indentation level of that statement does not match that of any former statement. For example, in the below code we unindent the second call to print
. However, the indentation level does not match that of any former statement:
>>> if True:
... if True:
... print('yes')
... print()
File "<stdin>", line 4
print()
^
IndentationError: unindent does not match any outer indentation level
This error is especially hard to catch because even one space will cause your code to fail.
The fix is to ensure that when you unindent a statement, the indentation level matches that of a former statement. Consider the above example once again. In the example, I want the second call to print to be in the first if
statements body. So I need to make sure that that line's indentation level matches that of the former statements in the first if
statement's body:
>>> if True:
... if True:
... print('yes')
... print() # indentation level now matches former statement's level.
...
yes
>>>
If your program visually appears to have correct indentation, but you're still getting an IndentationError
you have most likely mixed tabs with spaces. This will sometimes cause Python to raises strange errors. See the subsection Special cases under What does "TabError: inconsistent use of tabs and spaces in indentation" mean? for an more in-depth explanation of the problem.
This error only occurs when you attempt to mix tabs and spaces as indentation characters. As said above, Python will not allow your program to contain a mix of tabs and spaces, and will raise the specific exception TabError
if it finds you have. For example, in the program below, a mix of tabs and spaces is used for indentation:
>>> if True:
... if True:
... print()
... print()
... print()
File "<stdin>", line 5
print()
^
TabError: inconsistent use of tabs and spaces in indentation
But this often can't be seen visually since many editors render tabs and spaces the same. Note some editors do offer settings to render tabs and spaces with distinct symbols, which may be helpful.
For the above example, here is a representation of the whitespace. Dots are spaces, and arrows are tabs:
if·True:
····if·True:
→ ····print()
····print()
→ print()
We can see we have indeed mixed spaces and tabs for indentation.
Note Python will not always raise a TabError
if you mix tabs and spaces into your program. If the program indentation is unambiguous, Python will allow tabs and spaces to be mixed. For example:
>>> if True:
... if True: # tab
... pass # tab, then 4 spaces
...
>>>
And sometimes Python simply chokes on the mixture of tabs and spaces and erroneously raises an IndentationError
exception when a TabError
would be more appropriate. Another example:
>>> if True:
... print('a') # tab
... print('b') # 4 spaces
File "<stdin>", line 3
print('b') # 4 spaces
^
IndentationError: unindent does not match any outer indentation level
As you can see, running your code this way can create mysterious errors. Even though the program visually appears to be fine, Python became confused trying to parse the tabs and spaces used for indention and errored out.
These are excellent examples that demonstrate why to never mix tabs and spaces and make use of the -t
and -tt
interpreter flags when using Python 2.
If your program is short, probably the easiest and quickest fix is to simply re-indent the program. Make sure each statement is indented by four spaces per indention level (see How do I indent my code?).
However, if you already have a large program that you've mixed tabs and spaces into, there are automated tools that can be used to convert all of your indentation to just spaces.
Many editors such as PyCharm and SublimeText have options to automatically convert tabs to spaces. There are also several on-line tools such as Tabs To Spaces or Browserling that allow you to quickly re-indent your code. There are also tools written in Python. autopep8 for example can automatically re-indent your code and fix other indentation errors as well.
Even the best tools though will sometimes not be able to fix all of your indentation errors and you'll have to fix them manually. That's why it's important to always properly indent your code from the start.
SyntaxError
related indentation problemsSometimes certain SyntaxError
exceptions are raised due to incorrect indentation. For example, look at the code below:
if True:
print('x')
print('y') # oops! this statement should be indented!.
else:
print('z')
When the above code is run, a SyntaxError
is raised:
Traceback (most recent call last):
File "python", line 4
else:
^
SyntaxError: invalid syntax
Although Python raises a SyntaxError
, the real problem with the above code is that print('y')
should be indented. Because it isn't indented, Python doesn't realize that the previous if
statement and the else
statement are meant to be connected.
The fix for this type of error is to simply correctly re-indent your code. To see how to properly indent your code, see the section How do I indent my code?.
Don't get discouraged if you're still struggling. It can take time to get use to Python's whitespace syntax rules. Here are some tips to help: