title: Using True/False as keys - how/why does this work?
body: <p>I am comfortable using this simple syntax for initializing a <code>dictionary</code> </p>
  
  <pre><code>d = {'a':'Apple','b':'Bat'};
  </code></pre>
  
  <p>Today, while reading a page, I encountered this weird piece of code </p>
  
  <pre><code>{True:0, False:1}[True];
  </code></pre>
  
  <p>I was wondering why/how that could work? <code>True</code> and <code>False</code> are reserved keywords, 
  and so, that crazy syntax should be meaningless (for the compiler), but it is 
  not. </p>
  
  <pre><code>&gt;&gt;&gt; d = {True:0, False:1};
  &gt;&gt;&gt; d
  {False: 1, True: 0}
  </code></pre>
  
  <p>And this gets crazier </p>
  
  <pre><code>&gt;&gt;&gt; d = dict(True = 0, False = 1);
  SyntaxError: assignment to keyword
  &gt;&gt;&gt; d = dict(_True = 0, _False = 1);
  &gt;&gt;&gt; d
  {'_False': 1, '_True': 0}
  </code></pre>
  
  <p>In <code>dict()</code> constructor, <code>True</code> keyword is not allowed! But... </p>
  
  <p><hr>
  <strong>Update</strong></p>
  
  <pre><code>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.
  &gt;&gt;&gt; import keyword
  &gt;&gt;&gt; keyword.iskeyword('print');
  False
  &gt;&gt;&gt; keyword.iskeyword('else');
  True
  &gt;&gt;&gt; keyword.iskeyword('True');
  True
  &gt;&gt;&gt; keyword.iskeyword('False');
  True
  </code></pre>