我正在阅读the python language specification并发现有一个None
,
True
和False
令牌。我能理解None
和之间的区别
False
因为None
不是boolan。但是,关于True
和False
,为什么不呢
只有BOOLEAN
吗?是否存在True
和False
的情况
表现不同?或者是否有任何语义差异?
请注意,我在询问语法的差异而不是布尔值 显然是不同的。
答案 0 :(得分:3)
atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [testlist_comp] ']' |
'{' [dictorsetmaker] '}' |
NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
NAME
,NUMBER
和STRING
是代表三类令牌的令牌。它们中的每一个都代表一组无限的可能令牌。有许多数字文字可以归类为NUMBER
,许多字符串文字可以是STRING
等等。
只有两个布尔文字,True
和False
。可以编写令牌化程序以将它们分类为BOOLEAN
。可以,但不是。它们只在整个语法中被引用过一次,所以写'True' | 'False'
并不是什么大问题。
答案 1 :(得分:2)
这是True
和False
在python3中是特殊名称这一事实的形式化:您无法分配给它们。
它们不是BOOLEAN的原因很简单,布尔值不是解析器的valid token。
注意:你会发现python2语法中缺少这个细节,你可以实际分配名称True和False(...如果你想看世界燃烧)。
答案 2 :(得分:1)
据推测,你所引用的引用是指语法生成
atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [testlist_comp] ']' |
'{' [dictorsetmaker] '}' |
NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
这只会使字符串None
,True
和False
具有与某些其他语言元素相同的状态。虽然可以创建一个布尔原子的定义,可以是True
或False
并在语法中使用它,但是它有什么用途呢?
事实上,即使在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是作为同意成年人的编程语言而制作的。"如果你决心这样做,它最终会给你足够的绳索来吊死自己。