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


68

我知道分号在Python中是不必要的,但是它们可用于将多条语句填充到一行中,例如

>>> x = 42; y = 54

我一直认为分号等于换行符。因此,我很惊讶地得知(在Twitter上为Ned Batchelder),双分号是一个SyntaxError:

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

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

为什么这是一个错误?


9
分号不等于换行符,否则类似的东西if condition:;也是合法的,但不是。
tobias_k 16-3-20

@tobias_k不,这是不合法的。您将需要“通过”。但是'if condition:; pass'也不起作用。
palsch

2
为什么不应该是一个错误?没有理由编写这样的代码,并且接下来可能会混淆任何人阅读它,因此也不应将其完全非法(防止您输入错误,从而使您的同事想知道双冒号语法的作用是什么是当他们看到代码时)对Python有用的事情吗?
Mark Amery

您希望print [1, 2,, 3]工作吗?几乎是同一回事。
a安

Answers:


104

从Python语法中,我们可以看到;并未定义为\n。解析器期望在后面有另一条语句;,除非后面有换行符:

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

这就是为什么x=42;;不起作用;因为两个分号之间没有声明,因为“无”不是声明。如果它们之间有任何完整的语句,例如apass或什至只是a 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

您也可以说这是因为非终结符small_stmt不可为空,即空字符串(epsilon)与small_stmt不匹配。其他语言就是这种情况。
16th

可能是拼写错误:语法错误-“ if x == 2:”可能应该是42?
罗恩·克莱因

23

pass即使您有分号,仍然需要一个空语句。

>>> x = 42;pass;
>>> x
42

1
但是空行可以不通过而进行解析,因此此答案不能解释换行符和分号之间的区别
SuperBiasedMan

3
@SuperBiasedMan-我说的是一个空语句,而不是一个空行。
TigerhawkT3'3

啊,现在我明白了。可能需要使区分更清楚,因为它需要与行不同的语句。
SuperBiasedMan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.