【问题标题】:Python did not throw an indent error, but did not execute codePython没有抛出缩进错误,但是没有执行代码
【发布时间】:2018-03-06 13:38:47
【问题描述】:

在教朋友 python 时,我遇到了一个涉及缩进问题的奇怪案例。

以下是我正在使用的一段代码

while 1:
    a = raw_input("input: ")
    if not a:
        break
    values = a.split()
    print values

所以问题是朋友使用制表符缩进前 4 行,即

while 1:
    a = raw_input("Input: ")
    if not a:
        break

然后使用空格缩进剩余的代码。即以下部分

    values = a.split()
    print values

这段代码没有抛出缩进错误,我猜这是对的,因为制表符默认创建 4 个空格。

真正奇怪的是,除非满足中断条件,否则使用空格的部分不会被执行。

即输出如下

输入

Input: 123 123 123
Input: abc abc abc
Input: pqr abc 123

输出

['pqr', 'abc', '123']

预期输出

['123', '123', '123']
['abc', 'abc', 'abc']
['pqr', 'pqr', 'pqr']

为什么会发生这种情况? python解释器中的制表符和空格之战我错过了什么

【问题讨论】:

  • 第二部分正在被执行,但它在循环之外,所以只执行一次,用于最终输入。
  • @jonrsharpe 因为它与缩进级别匹配,我认为它在正确的缩进级别。如果我错了,你能解释一下吗?
  • 好吧,如果你没记错的话,你肯定会看到预期的输出吗?你看到的输出告诉你它是如何被解释的
  • AFAIK,Python 将制表符解释为不是四个,而是八个空格,因此从技术上讲,该代码应该在 break 之后,即无法访问。这也是它对我的表现,例如当我用pass替换break时。
  • @tobias_k 这不是真的,无论如何都无关紧要 - 有一个错误是您在单个 python 源代码文件中有制表符和空格。

标签: python python-2.7


【解决方案1】:

Python 2 对制表符只有一种解释:它们总是等价于八个空格(您的 IDE 可能会将它们显示为其他内容,但 Python 和您的 IDE 不是在说话的条件下)。知道了这一点,您的最终语句显然在循环体之外。

Python 3 没有这个问题;如果您混合使用制表符和空格,它将引发SyntaxError(拒绝猜测,根据 Python 之禅 [import this])。我建议配置您的编辑器以使文字选项卡显示不同(例如在vimset listchars=tab:~>,trail:#set list 中将选项卡和尾随空格显示为字符),当然,将其配置为自动扩展新插入的选项卡(例如set expandtab),而不仅仅是将它们解释为四个空格(事实上,将它们解释为八个空格可以让您更准确地解释 Python 2 将如何看待它)。

或者,invoke the Python 2 interpreter with -t or -tt 会发出混合制表符和空格警告 (-t) 或错误 (-tt),以便更容易消除此类问题。

【讨论】:

  • “知道了,你的最终语句显然在循环体之外。”是的,但是他们在哪里呢?如果最后一行用 4 个空格缩进,其余行用制表符(即 8 个空格)缩进,那么这两行不应处于任何有效(先前)缩进级别,因此会产生错误。
  • 现在我明白代码是怎么回事了!还有朋友 IDE,他完全是初学者,对 ZEN 代码或 PEP8 的东西不太了解。感谢您的信息!
  • @tobias_k:OP 声明前四行用制表符缩进;其中包括while。我猜原始代码在缩进块中(未显示)。如果while(看起来没有缩进)和接下来的三行前面有一个制表符,最后两行前面有四个空格(也没有显示),那么while实际上是8个空格缩进(对于未显示的选项卡),最后两行是 4(未显示)+ 4(显示)空格,总共缩进 8 个空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
相关资源
最近更新 更多