Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
335 views
in Technique[技术] by (71.8m points)

python - Using True/False as keys - how/why does this work?

I am comfortable using this simple syntax for initializing a dictionary

d = {'a':'Apple','b':'Bat'};

Today, while reading a page, I encountered this weird piece of code

{True:0, False:1}[True];

I was wondering why/how that could work? True and False are reserved keywords, and so, that crazy syntax should be meaningless (for the compiler), but it is not.

>>> d = {True:0, False:1};
>>> d
{False: 1, True: 0}

And this gets crazier

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

In dict() constructor, True keyword is not allowed! But...


Update
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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

While they are keywords (in Python 3), True and False are still names of objects (they are, respectively bool(1) and bool(0)).

So you can use them anywhere a value makes sense. Since they're hashable, that includes using them as dictionary keys. You can do:

d = {}
d[True] = "True"
d[False] = "False"

You can get the same dictionary directly with curly brackets (d = {True: "True", False: "False"}), but not using the dict constructor with keyword arguments. The keyword version of the constructor only builds dicts with keys that are strings, and those strings must be legal Python identifiers. True and False are not strings, nor (since they're keywords) can they be used as identifiers.

You can of course use the sequence of key/value tuples constructor, if there's some reason you need to be calling dict rather than using brackets:

d = dict([(True, "True"), (False, "False")])

I would note that the code fragment you show is a bit silly. The bool type in Python is a subclass of int, so you can do mathematical operations on True or False if you want. The dictionary indexing code is equivalent to 1-True, which will be 0.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...