当我编译下面的python代码时,我得到
IndentationError: unindent does not match any outer indentation level
import sys
def Factorial(n): # Return factorial
result = 1
for i in range (1,n):
result = result * i
print"factorial is",result
return result
为什么?
如果不将"result=0"更改为"result=1",那么阶乘就不会是…好。。。准确:-)
如果你想在计算中包含"n",那么范围(1,n+1)可能会更好。
我也有同样的错误,但是我碰巧在代码中向上稍微向左缩进了一个方法,这在后面的下一个方法的底部给出了这个错误。因此,这个错误不仅会发生在混合制表符和空格中。
我用的是崇高的文本3。我有一个Django项目。我用View > Indentation > Intent Using Spaces修正了这个错误。
其他的海报可能是正确的……你的标签中可能有混合的空间。尝试执行搜索&replace,将所有选项卡替换为几个空格。
试试这个:
import sys
def Factorial(n): # return factorial
result = 1
for i in range (1,n):
result = result * i
print"factorial is",result
return result
print Factorial(10)
是的,我必须在最后两行的内环部分留出空间(仅限这样)。不知道为什么…
我的第一行"result=0"(应该是1,谢谢更正)是间隔的,其余的是标签式的darn,不知道python是这样的。
是的,这可能很棘手。我使用emacs来编辑python,并且我有它的设置,总是用py文件中的空格替换制表符,所以我没有这个问题。记事本++也可能有这样的选项。
有同样的问题ATM:。Sublimetext将空间显示为点,这非常有用。
所以等一下,你可以用空格或制表符缩进。你只是需要体贴?刘海
我想知道为什么开发人员不尝试修复这个错误。当配置已经提到tabs=4个空格时,这是无用的。所以,两者都应该随时工作。它是2018
谢谢,不解释的错误信息
有时,在预分出的行上可以有前导空格,这似乎完全混淆了Python。使过去是棘手的像那个b4 gmake…
重要:空格是首选方法-请参阅PEP008缩进和制表符或空格?(多亏了@siha。)
对于Sublime Text用户:
将Sublime Text设置为使用制表符进行缩进:View->Indentation->Convert Indentation to Tabs。
取消选中上述同一子菜单中的Indent Using Spaces选项。这将立即解决此问题。
另外,无论何时使用python,请确保在使用的任何IDE/文本编辑器中都设置了类似的选项。
同样在Atom上,packages>whitespace>将空格转换为制表符,这样可以避免python的语法错误。
魅力十足!谢谢!!
非常感谢你!升华其实对Python很不利:/
空格是首选方法-请参阅PEP008缩进和制表符或空格?.Sublime也可以设置成这样。
你说空间是首选的方法,但你的答案要求人们要求崇高使用标签代替!我很困惑
@很不幸,那发生在我回答问题之后。如果您正在开始一个新项目,请使用首选的空格技术。这就是为什么我用粗体编辑,以便新来的人都知道免责声明。
cat -T yourfile.py将有助于更容易发现这一点。我在Pydoc的开头有一个标签,想知道删除Pydoc会为我消除这个错误。
像魔法一样工作!谢谢!
要轻松检查选项卡/空格的问题,实际上可以执行以下操作:
python -m tabnanny yourfile.py
或者你也可以正确地设置你的编辑器——当然。
我在一个文件中尝试了这个方法,但有一些制表符/空格缩进错误,但是没有一个文件输出不正确的制表符。有什么想法吗?
相同,没有输出
我对空格有问题,错误是在191行,但多亏了泰伯南尼,我发现真正的问题不在那行,而是在上面的行。
您确定在缩进空白处没有混合制表符和空格吗?(这将导致该错误。)
注意,建议不要在Python代码中使用制表符。请参见样式指南。您应该配置notepad++为选项卡插入空格。
我搞糊涂了。上面的答案是切换文本编辑器选项以使用制表符而不是空格。
@只要你只使用标签或者空格,技术上来说,你选择哪个并不重要。尽管对于python,空间是首选的,但是请参见我提到的链接。
每当我遇到这个错误,都是因为我在编辑器中混淆了制表符和空格。
谢谢,这很有用,所以我必须先在文本编辑器中设置制表符或空格。
如果使用python的空闲编辑器,可以按照类似错误消息中的建议进行操作:
1)全选,如ctrl+a
2)转到"格式"->"不区分区域"
3)再次检查缩进是否正确,保存并重新运行程序。
我使用的是python 2.5.4
完美的解决方案。大多数编辑器使用4个空格作为制表符。
行:result = result * i应该缩进(它是for循环的主体)。
或者-您有混合空格和制表符
我不得不把编辑改得很奇怪。在问题中查看我更新的"编辑"注释
好的,所以我相信我的答案的第二行是正确的-您有混合空格和制表符(分别是32和8个ASCII字符)
如果你使用VIM,点击Escape然后输入
gg=g
这将自动缩进所有内容,并清除您已放入的所有空格。
不是编辑器命令。
看起来是一个压痕问题。您不必匹配Python中的花括号,但必须匹配缩进级别。
防止空格/制表符问题的最佳方法是在文本编辑器中显示不可见字符。这将为您提供一种快速的方法来防止和/或解决与缩进相关的错误。
此外,注入复制粘贴代码也是此类问题的常见来源。
原子论
去
Packages > Whitespace > Convert Spaces to Tabs
然后再次检查文件缩进:
python -m tabnanny yourfile.py
或
>python
>>> help("yourFile.py")
如果使用记事本++,请使用扩展搜索模式进行"替换"以查找并替换为四个空格。
对于Atom用户,Packages ->whitspace -> remove trailing whitespaces这对我有用
我昨天也出了同样的问题,那是缩进错误,使用的是高级文本编辑器。我花了好几个小时试图修复它,最后我把代码复制到了vi文本编辑器中,它工作得很好。ps python对空格太敏感,请确保不要混合空格和制表符。
只是一个补充。我在记事本+中的两个缩进也有类似的问题。
无例外压痕
外压痕水平
转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在用四个空格替换
转到---->搜索选项卡---->点击替换---->点击下面扩展的单选按钮----->现在替换为空
由于我知道没有针对spyder的答案,我将添加一个:基本上,仔细查看您的if声明,确保所有if、elif和else具有相同的间距,即它们在开始时位于同一行,就像这样:
def your_choice(answer):
if answer>5:
print("You're overaged")
elif answer<=5 and answer>1:
print("Welcome to the toddler's club!")
else:
print("No worries mate!")
我定义了一个函数,但除了函数注释之外,它没有任何内容…
def foo(bar):
# Some awesome temporary comment.
# But there is actually nothing in the function!
# D'Oh!
它喊道:
File"foobar.py", line 69
^
IndentationError: expected an indented block
(注意,^标记指向的行为空)
——
多种解决方案:
1:只需对函数进行注释
2:添加函数注释
def foo(bar):
'' Some awesome comment. This comment could be just one space.''
3:添加不起作用的行
def foo(bar):
0
在任何情况下,确保它是一个空函数的原因是显而易见的——对于您自己,或者对于将使用您的代码的同事来说。
这里的pass语句可能很有用:)
我用的是Jupyter笔记本,几乎所有上述的解决方案(适应我的场景)都没用。然后,我一行一行地删除了每行的所有空格,并替换为制表符。解决了这个问题。
首先,为了提醒您有一个逻辑错误,您最好保持result=1,否则即使循环运行之后,输出结果也将为result=0。
其次,你可以这样写:
import sys
def Factorial(n): # Return factorial
result = 0
for i in range (1,n):
result = result * i
print"factorial is",result
return result
留下一行将告诉python shell for语句已经结束。如果您有使用python shell的经验,那么您可以理解为什么我们必须留下一行代码。
就其价值而言,我的docstring缩进太多,这也会引发相同的错误。
class junk:
"""docstring is indented too much"""
def fun(): return
IndentationError: unindent does not match any outer indentation level
如果您在python开发中使用sublime文本,可以使用包anaconda来避免错误。
open your file in sublime
right click on the open spaces
choose anaconda
click on autoformat
DONE Or Press CTRL+ALT+R.
在我的例子中,问题在于Eclipse上Pydev的配置
这是因为标签和空格混合在一起。您可以删除所有空格并用制表符替换它们。
或者,试着写这个:
#!/usr/bin/python -tt
在代码的开头。此行解决了制表符和空格之间的任何差异。
这可能是因为上面的函数缩进方式不同。即
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
示例代码的语法无效。
如果使用Komodo编辑器,则可以按照类似错误消息中的建议进行操作:
1)全选,如ctrl+a
2)转到"代码"->"无双区"
3)再次检查缩进是否正确,保存并重新运行程序。
我使用的是python 3.4.2
这主要是由于编辑器的缘故。请尝试将制表符更改为空格(4)。最适合Python的IDE或编辑器是pycharm、sublime、vim for linux。
即使我也遇到过同样的问题,后来我发现有一个编码问题。我建议你也改变你的编辑。