python - 为什么双分号是 Python 中的 SyntaxError?

标签 python syntax-error language-lawyer

我知道分号在 Python 中是不必要的,但它们可以用来将多个语句塞进一行,例如

>>> x = 42; y = 54

我一直认为分号相当于换行符。所以我有点惊讶地得知 (h/t Ned Batchelder on Twitter ) 双分号是 SyntaxError:

>>> x = 42
>>> x = 42;
>>> x = 42;;
  File "<stdin>", line 1
    x = 42;;
           ^
SyntaxError: invalid syntax

我假设最后一个程序等同于 x = 42\n\n。我原以为分号之间的语句被视为空行,无操作。显然不是。

为什么会出现这个错误?

最佳答案

从Python语法我们可以看出,;没有被定义为\n。解析器希望在 ; 之后有另一个语句,除非它后面有换行符:

                     Semicolon w/ statement    Maybe a semicolon  Newline
                          \/     \/               \/                \/
simple_stmt: small_stmt (';' small_stmt)*        [';']            NEWLINE

这就是 x=42;; 不起作用的原因;因为两个分号之间没有陈述,因为“无”不是陈述。如果它们之间有任何完整的语句,比如 pass 甚至只是一个 0,那么代码就可以工作。

x = 42;0; # Fine
x = 42;pass; # Fine
x = 42;; # Syntax error

if x == 42:; print("Yes") # Syntax error - "if x == 42:" isn't a complete statement

关于python - 为什么双分号是 Python 中的 SyntaxError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36111915/

相关文章:

c++ - constexpr 静态成员函数用法

python - Python 中的客户端服务器套接字编程

ios - 数组类型现在用元素类型两边的方括号书写

mysql - 在 MySQL 中使用 UPDATE 和 JOIN 时出现语法错误 "near FROM"?

java - 是否存在不必要的分号语法错误?

c++ - std::ignore 与结构化绑定(bind)?

python - 将父类作为参数传递?

python - 如何处理阿拉伯语中的重复字母

python - Python 中 range() 中的嵌套 range()

php - PHP解析/语法错误;以及如何解决它们