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

时间:2014-03-08 21:00:26

标签: python python-3.x python-3.3

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

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

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

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

我想知道为什么/如何起作用? TrueFalse是保留关键字, 所以,那个疯狂的语法应该没有意义(对于编译器来说),但确实如此 不。

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

这变得更疯狂了

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

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

3 个答案:

答案 0 :(得分:8)

虽然它们是关键字(在Python 3中),但TrueFalse仍然是对象的名称(它们分别是bool(1)bool(0))。

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

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

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

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

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

我会注意到你显示的代码片段有点傻。 Python中的bool类型是int的子类,因此如果需要,您可以在TrueFalse上执行数学运算。字典索引代码相当于1-True,它将是0

答案 1 :(得分:4)

为什么它毫无意义? TrueFalse是值,而不是关键字。这就是为什么你可以用它们比较其他值。

您也不能在dict构造函数中使用整数。这是关键字参数的限制,而不是字典。

答案 2 :(得分:2)

TrueFalse不是关键字 - 它们是实际对象。你可以在Python解释器中验证这一点(这里使用2.7,但在3.x中也是如此):

Python 2.7.6 (default, Jan 29 2014, 21:22:07) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> type(True)
<type 'bool'>
>>> True.__class__.__name__
'bool'
>>> type(False)
<type 'bool'>
>>> False.__class__.__name__
'bool'
>>> hash(True)
1
>>> hash(False)
0
>>> True.__hash__
<method-wrapper '__hash__' of bool object at 0x100134da0>
>>> False.__hash__
<method-wrapper '__hash__' of bool object at 0x100134db8>

因此它们可以用作字典或类似结构中的键。

事实上,在Python 3之前,您可以使用TrueFalse作为dict()的参数名称:

>>> d = dict(True="true", False="false")
>>> d
{'False': 'false', 'True': 'true'}

但是,为了避免混淆,Python 3解释器会阻止您这样做,因为它现在基本上将它们视为关键字 - 但实际上,它们仍然是对象。 (我猜你可以说他们两个都是。)