虽然不一定准确, 但是我还是愿意如下简单的理解:

  • 表达式有值
  • 语句不一定有值

曾经有一个疑惑, 为什么如下写法在 Python 中无效, 然而在 Perl 等语言中是有效的:

Python:

(var = 1) if True else (var = 0) # syntax error

Perl:

1 ? $_ = 1 : $_ = 0; # everything's fine

流畅的Python 这本书中, 第五章, 杂谈里看到一句话, 有可能解释了我的一些疑惑. 书中的原文大致如下:

Lisp 中一切都是表达式, Python 使用的是面向语句的语法. 我在写 Python 的时候, 很想念有值的 try/catch 语句.

关键这里强调了一点, Python 中, 并非所有东西都是表达式, 也就是并非所有东西都有值.

但是 Lisp 所有东西都是表达式, 都有值.

而 Perl 的行为与 Lisp 类似, 因为原文中提到 try/catch 在 Lisp 中是有值的, 而 Perl 中的 try/catch 就是有值的.


那么原因其实大概就知道了, 在运算符的各个位置, 是期待一个值的. 一个无值的语句只能单独使用, 无法和别的运算符一起并列.

上面的疑惑中也的确是这样, Perl 中, $_ = 1 这个赋值语句本身也是有值的, 值就是 1.

而 Python 中, var = 1 这个赋值语句本身是没有任何值的, 连 None 这种值都没有, 所以无法和 if/else 一起使用.

Comments
Write a Comment