虽然looking at an answer given by wwii,我评论他的缩进说这是错误的。然而,在我的IDLE中运行他的代码后,我发现它运行顺利。
我尝试了几个例子,只是为了确保我得到正确的结果:
>>> def foo():
return 0
>>> foo()
0
>>> def bar():
return foo() + 5
>>> bar()
5
>>> def foobar():
return foo() + bar()
>>> foobar()
5
>>>
如你所见,所有这些都运行良好。如果我在常规脚本中尝试相同的操作,Python会在我的程序运行之前引发错误,告诉我忘记缩进块:
为什么在交互式IDLE中允许这种缩进,而不是在常规脚本中?我查看了IDLE的文档,更具体地说是25.5.2.1 Automatic indentation部分,这对找到答案毫无帮助。
此外,the Python documenation on functions表示函数体必须缩进:
关键字def引入了一个函数定义。它必须后跟函数名称和带括号的形式参数列表。构成函数体的语句从下一行开始,必须缩进。
(强调我的)
为什么在IDLE中允许这种缩进,但在常规脚本中完全关闭?这是故意的吗?如果是这样,这种行为是否记录在某处?
答案 0 :(得分:2)
代码是正确的,但IDLE REPL与Python不同:
>>> def foo():
return 0
IDLE打印出而Python:
>>> def foo():
... return 0
看到返回前的四个空格,但由于它们与最左边的列对齐而不是以三个点和一个空格为前缀,如果您希望代码缩进更多,则空格似乎不存在。 / p>
答案 1 :(得分:1)
你在IDLE中有正确的缩进,在你的脚本中有错误。
在IDLE中,return 0
之前有4个空格。并且在你的脚本中没有。
你的脚本应该是这样的:
def foo():
return 0
def bar():
return foo() + 5
def foobar():
return foo() + bar()
print(foo())
print(bar())
print(foobar())
它使用>>>
标记作为下一个命令输入的开头。这是标准方法。它(在变体中)随处可见。
>>> <-start of the line. Zero spaces.
<-start of the line. Zero spaces.
所以下一个代码会有错误的缩进:
>>> def foo():
return 0
因为它等同于脚本文件中编写的下一个代码:
def foo():
return 0
>>> <-start of the line. Zero spaces.
<-start of the block. Indent 4 spaces.
所以下一个代码会有正确的缩进:
>>> def foo():
return 0
因为它等同于脚本文件中编写的下一个代码:
def foo():
return 0
答案 2 :(得分:1)
您在IDLE中看到的>>>
只是一个提示。巧合的是,这个提示恰好是四个字符,你恰好用四个空格缩进你的代码。
要查看并思考代码的确如何工作,请删除所有>>>
提示。为清楚起见,我们也会删除打印结果。
现在看起来像普通的Python代码:
def foo():
return 0
foo()
def bar():
return foo() + 5
bar()
def foobar():
return foo() + bar()
foobar()
因此,IDLE与任何其他Python解释器没有什么不同,它只是将>>>
提示符放在第一行上的方式让人感到困惑。如果你考虑一下这四个字符被移除后代码的外观,那么这一切都会更有意义。