Unindent 不匹配任何外部缩进级别 (Python)
Unindent does not match any outer indentation level (Python)
当我们在同一代码块中混合使用制表符和空格时,会出现 Python“IndentationError: unindent does not match any outer indentation level”。
要解决该错误,请删除间距并仅使用制表符或空格,但不要将两者混合在同一代码块中。
下面是错误如何发生的示例。
# ⛔️ IndentationError: unindent does not match any outer indentation level if len('hi') == 2: print('a') # 👈️ indented using tabs print('b') # 👈️ indented using spaces
代码块中的第一行使用制表符缩进,第二行使用空格缩进。
屏幕截图显示该print('a')
行使用制表符缩进,该
print('b')
行使用空格缩进。
使用制表符标识代码块中的所有行
要解决该错误,请删除空格并仅使用制表符或空格缩进代码块中的行。
您的错误消息应显示出现错误的确切位置,以便您可以删除空格并使用制表符或空格一致地缩进代码块中的行。
您应该只在整个代码块中使用制表符或只使用空格(取决于您的偏好)。
解决错误的最佳方法是删除前导空格并仅使用制表符缩进行。
# ✅ correctly indented code if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c')
如果您从 Internet 复制代码并将其粘贴到您的 IDE 中,请删除缩进并仅使用制表符手动缩进行。
在您的 IDE 中将缩进转换为制表符
如果您使用 VSCode,您可以使用“将缩进转换为空格”或“将缩进转换为制表符”命令来解决错误:
- 按
CTRL + Shift + P
或(在 Mac 上为⌘
+Shift
+P
)打开命令面板。 - 类型:“将缩进转换为”
- 选择您的首选选项
- 保存文件
如果你使用 VSCode,你可以通过以下方式显示空白字符:
- 按
CTRL + Shift + P
或(在 Mac 上为⌘
+Shift
+P
)打开命令面板。 - 输入“打开工作区设置”
- 打字
renderwhitespace
- 将其设置为
all
如果您在 IDE 中呈现空白字符,制表符应显示为箭头,空格应显示为点。
解决Sublime Text中的错误
如果您使用 Sublime Text,您可以通过以下方式将其设置为使用制表符进行缩进:
- 单击查看->缩进->将缩进转换为制表符
如果选中了Indent using spaces复选框,您也可以取消选中它。
解决VIM中的错误
如果您使用 VIM,请点击Escape
,gg=G
键入并按Enter
。
请注意该行是如何自动正确缩进的。
解决IDLE代码编辑器中的错误
如果您使用 IDLE 代码编辑器:
- 按
CTRL
+A
选择文件中的所有代码。 - 点击顶部菜单中的Format ,然后点击Untabify Region。
3. 选择每个选项卡 8 列,然后单击确定。
单击“确定”按钮后,保存文件,然后就可以开始了。
确保不要混用制表符和空格
如果仅使用制表符或仅使用空格,这是个人喜好问题,但请确保不要将两者混用。
仅当您在同一代码块中混合使用制表符和空格时才会引发此错误。
上面的if
语句使用制表符进行缩进,下面的语句使用空格。
该示例不会导致错误,因为我们没有在同一代码块中混合使用制表符和空格。
使用 tabnanny 检测缩进错误
您可以使用tabnanny
内置模块来检测在哪一行发生了缩进错误。
python -m tabnanny main.py # 👇️ for Python 3 python3 -m tabnanny main.py # 👇️ for Windows py -m tabnanny main.py
确保main.py
在命令中替换为实际文件的名称。
报错信息显示错误发生在第36行。
换句话说,我必须从第 36 行中删除前导空格并一致地缩进代码(仅使用空格或仅使用制表符)。
Python 使用缩进来确定哪个代码属于一个块
Python 使用代码的缩进级别来确定哪些代码属于一个块。
a_list = ['a', 'b', 'c'] for item in a_list: print(item) # 👈️ inside the block print('last') # 👈️ outside the block
for 循环print(item)
中的调用是缩进的,属于循环的块。for
最后一行的调用print
没有缩进,不属于循环块for
。
Python 知道您是否打算在循环的每次迭代中运行 print
()for
的唯一方法是基于缩进级别。
代码块中的所有行都必须使用制表符或空格缩进,但不能同时缩进。
您不应该使用制表符在代码块中缩进 1 行,而另一行使用空格缩进,因为这会导致错误。
代码块定义为以冒号结尾的行
当一行以冒号结尾时,下一行应该缩进以被视为该块的一部分。
if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c')
if
,elif
和语句的行else
以冒号结尾,因此要运行属于相应块的代码,我们必须使用制表符或空格将其缩进。
确保不要混用制表符和空格,例如,不要使用制表符来缩进块if
,也不要使用空格来缩进elif
块。
下面是一些使用制表符在以冒号结尾的语句后缩进代码块的示例。
if len('hi') == 2: print('a') elif len('hello') == 5: print('b') else: print('c') def get_num(): return 100 for item in ['a', 'b', 'c']: print(item)
所有代码块都使用制表符一致缩进,因此一切都按预期进行。
pep8 风格指南推荐使用空格
pep8风格指南
建议在制表符上使用空格进行缩进。
根据建议,应该在已经使用制表符缩进的代码库中使用制表符。
但是,他们建议为新项目使用空间。
如前所述,Python 不允许混用制表符和空格进行缩进。
使用制表符还是空格取决于个人喜好,但请确保不要将两者混合在同一代码库中,因为这通常会导致 Python 出现问题。