为什么双分号是 Python 中的 SyntaxError?
Why is a double semicolon a SyntaxError in Python?
我知道分号在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;;
不起作用的原因;因为两个分号之间没有语句,因为 "nothing" 不是语句。如果它们之间有任何完整的语句,比如 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
一个空语句仍然需要pass
,即使你有一个分号。
>>> x = 42;pass;
>>> x
42
我知道分号在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;;
不起作用的原因;因为两个分号之间没有语句,因为 "nothing" 不是语句。如果它们之间有任何完整的语句,比如 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
一个空语句仍然需要pass
,即使你有一个分号。
>>> x = 42;pass;
>>> x
42