title: Why does '() is ()' return True when '[] is []' and '{} is {}' return False?
body: <p>From what I've been aware of, using <code>[], {}</code> or <code>()</code> to instantiate objects returns a new instance of <code>list, dict</code> or <code>tuple</code> respectively; a new instance object with <em>a new identity</em>. </p>
  
  <p>This was pretty clear to me until I actually tested it and I noticed that <code>() is ()</code> actually returns <code>True</code> instead of the expected <code>False</code>:</p>
  
  <pre><code>&gt;&gt;&gt; () is (), [] is [], {} is {}
  (True, False, False)
  </code></pre>
  
  <p>as expected, this behavior is also manifested when creating objects with <a href="https://docs.python.org/3/library/functions.html#func-list" rel="nofollow noreferrer"><code>list()</code></a>, <a href="https://docs.python.org/3/library/functions.html#func-dict" rel="nofollow noreferrer"><code>dict()</code></a> and <a href="https://docs.python.org/3/library/functions.html#func-tuple" rel="nofollow noreferrer"><code>tuple()</code></a> respectively:</p>
  
  <pre><code>&gt;&gt;&gt; tuple() is tuple(), list() is list(), dict() is dict()
  (True, False, False)
  </code></pre>
  
  <p>The only relevant piece of information I could find in <a href="https://docs.python.org/3/library/stdtypes.html#tuple" rel="nofollow noreferrer">the docs for <code>tuple()</code></a> states:</p>
  
  <blockquote>
    <p>[...] For example, <code>tuple('abc')</code> returns <code>('a', 'b', 'c')</code> and <code>tuple([1, 2, 3])</code> returns <code>(1, 2, 3)</code>. <strong>If no argument is given, the constructor creates a new empty tuple, <code>()</code>.</strong></p>
  </blockquote>
  
  <p>Suffice to say, this isn't sufficient for answering my question. </p>
  
  <p>So, why do empty tuples have the same identity whilst others like lists or dictionaries do not?</p>