3

看着这个问题,我在我的机器上尝试了 OP 的代码。这是文本版本和屏幕截图:

坏广场

刚才发生了什么?这应该是一个square功能,并且正确实现。可以肯定的是,我复制粘贴了代码,然后再次尝试:

好广场

好吧,我看不出这些版本之间的任何区别square,但只有后者有效。

我能想到的唯一原因是我可能混合了制表符和空格,因此该return语句实际上是缩进的,因此循环只执行一次。但我无法重现它,而且它看起来像是解释器混合缩进检查中的一个令人难以置信的缺陷。所以我有两个问题,或者可能是三个:

  1. 我想念什么?
  2. 如果这是一个混合缩进的东西,它可能是什么,究竟是什么?
  3. 如果这是一个混合缩进的东西,为什么它没有被解释器捕捉到?显然,python 中缩进的整个想法(以及一般情况下)是为了避免此类问题。让这些事情溜走太重要了。
4

3 回答 3

2

简单的!

def square(x):
    runningtotal = 0
    for counter in range(x):
        runningtotal = runningtotal + x
<tab>return runningtotal

首先,将制表符替换为(从左到右)一到八个空格,这样直到并包括替换的字符总数是八个<...>的倍数

所以最后一行的这个制表符被替换为 8 个空格并进入循环。

于 2013-06-12T22:21:26.563 回答
2

对于 Python 缩进 - atab被视为相当于 8 个空格

由于人们几乎从来没有将他们的标签宽度设置为 8 个空格,因此将两者混合从来都不是一个好主意。

像许多人一样,我以前更喜欢使用制表符进行缩进,但发现在通过电子邮件发送代码或在论坛上发帖等时,它经常会引起混淆。这就是这里发生的事情

这些天最常见的事情是只在编辑器中的 tab 键插入 4 个空格。

关键是 Python 必须尊重制表符,因为向后兼容,但不再使用它们不是一个好主意。

正如@Fredrik 所提到的,-t手册页中有一个选项

      -t 当源文件混合制表符和空格时发出警告
              缩进取决于标签的价值
              用空格表示。给出选项时发出错误
              两次。

这里return runningtotal有一个标签。

$ python -tt
Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def square(x):
...     runningtotal = 0
...     for counter in range(x):
...         runningtotal = runningtotal + x
...     return runningtotal
  File "<stdin>", line 5
    return runningtotal
                      ^
TabError: inconsistent use of tabs and spaces in indentation
于 2013-06-12T22:23:18.453 回答
0

我遇到过类似的问题,对我来说错误是混合缩进:找到空格。

解决方案:在带有 Pydev 的 Eclipse 中,Source 菜单 -> Convert tabs to space-tabs。

于 2021-05-03T07:02:29.683 回答