python整体向右缩进两个级别_关于python:IndentationError:unindent与任何外部缩进级别都不匹配...

当我编译下面的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。

即使我也遇到过同样的问题,后来我发现有一个编码问题。我建议你也改变你的编辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值