使用True/False作为键 - 这是如何工作的?

GLE*_*LES 10 python python-3.x python-3.3

我很乐意使用这个简单的语法来初始化a dictionary

d = {'a':'Apple','b':'Bat'};
Run Code Online (Sandbox Code Playgroud)

今天,在阅读页面时,我遇到了这段奇怪的代码

{True:0, False:1}[True];
Run Code Online (Sandbox Code Playgroud)

我想知道为什么/如何起作用?True并且False是保留关键字,因此,疯狂的语法应该没有意义(对于编译器),但事实并非如此.

>>> d = {True:0, False:1};
>>> d
{False: 1, True: 0}
Run Code Online (Sandbox Code Playgroud)

而这变得更疯狂

>>> d = dict(True = 0, False = 1);
SyntaxError: assignment to keyword
>>> d = dict(_True = 0, _False = 1);
>>> d
{'_False': 1, '_True': 0}
Run Code Online (Sandbox Code Playgroud)

dict()构造函数中,True不允许使用关键字!但...


更新

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import keyword
>>> keyword.iskeyword('print');
False
>>> keyword.iskeyword('else');
True
>>> keyword.iskeyword('True');
True
>>> keyword.iskeyword('False');
True
Run Code Online (Sandbox Code Playgroud)

Blc*_*ght 10

虽然他们的关键字(在Python 3),True并且False仍然是对象的名称(它们分别是bool(1)bool(0)).

因此,您可以在价值合理的任何地方使用它们.由于它们是可以清除的,因此包括将它们用作字典键.你可以做:

d = {}
d[True] = "True"
d[False] = "False"
Run Code Online (Sandbox Code Playgroud)

您可以使用花括号(d = {True: "True", False: "False"})直接获取相同的字典,但不能使用dict带有关键字参数的构造函数.构造函数的关键字版本仅使用作为字符串的键构建dicts,并且这些字符串必须是合法的Python标识符.True并且False不是字符串,也不是(因为它们是关键字)它们可以用作标识符.

您当然可以使用键/值元组构造函数的序列,如果有某些原因需要调用dict而不是使用括号:

d = dict([(True, "True"), (False, "False")])
Run Code Online (Sandbox Code Playgroud)

我会注意到你显示的代码片段有点傻.在boolPython中类型的子类int,所以你可以在做数学运算True或者False,如果你想要的.字典索引代码相当于1-True,它将是0.