python语法中的True和False有什么区别?

时间:2016-09-16 21:01:21

标签: python

我正在阅读the python language specification并发现有一个NoneTrueFalse令牌。我能理解None和之间的区别 False因为None不是boolan。但是,关于TrueFalse,为什么不呢 只有BOOLEAN吗?是否存在TrueFalse的情况 表现不同?或者是否有任何语义差异?

请注意,我在询问语法的差异而不是布尔值 显然是不同的。

3 个答案:

答案 0 :(得分:3)

atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [testlist_comp] ']' |
       '{' [dictorsetmaker] '}' |
       NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')

NAMENUMBERSTRING是代表三类令牌的令牌。它们中的每一个都代表一组无限的可能令牌。有许多数字文字可以归类为NUMBER,许多字符串文字可以是STRING等等。

只有两个布尔文字,TrueFalse。可以编写令牌化程序以将它们分类为BOOLEAN。可以,但不是。它们只在整个语法中被引用过一次,所以写'True' | 'False'并不是什么大问题。

答案 1 :(得分:2)

这是TrueFalse在python3中是特殊名称这一事实的形式化:您无法分配给它们。

它们不是BOOLEAN的原因很简单,布尔值不是解析器的valid token

注意:你会发现python2语法中缺少这个细节,你可以实际分配名称True和False(...如果你想看世界燃烧)。

答案 2 :(得分:1)

据推测,你所引用的引用是指语法生成

atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [testlist_comp] ']' |
       '{' [dictorsetmaker] '}' |
       NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')

这只会使字符串NoneTrueFalse具有与某些其他语言元素相同的状态。虽然可以创建一个布尔原子的定义,可以是TrueFalse并在语法中使用它,但是它有什么用途呢?

事实上,即使在2.7中,您也可以尝试从True命名空间中删除False__builtins__定义:

>>> del __builtins__.True
>>> del __builtins__.False

Traceback (most recent call last):
  File "/Users/sholden/.virtualenvs/jlab/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
NameError: global name 'True' is not defined

有趣的是,如果您先删除False,则不会有关于删除True的投诉: - )

然而,这使得即使是非常标准的Python根本没有意义:

>>> 1 == 1

Traceback (most recent call last):
  File "/Users/sholden/.virtualenvs/jlab/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
NameError: global name 'True' is not defined

这强调了Python是作为同意成年人的编程语言而制作的。"如果你决心这样做,它最终会给你足够的绳索来吊死自己。