list() uses more memory than list comprehension
<p>So i was playing with <code>list</code> objects and found little strange thing that if <code>list</code> is created with <code>list()</code> it uses more memory, than list comprehension? I'm using Python 3.5.2</p>

<pre><code>In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
</code></pre>

<p>From the <a href="https://docs.python.org/3.5/library/stdtypes.html#list">docs</a>:</p>

<blockquote>
  <p>Lists may be constructed in several ways:</p>
  
  <ul>
  <li>Using a pair of square brackets to denote the empty list: <code>[]</code></li>
  <li>Using square brackets, separating items with commas: <code>[a]</code>, <code>[a, b, c]</code></li>
  <li>Using a list comprehension: <code>[x for x in iterable]</code></li>
  <li>Using the type constructor: <code>list()</code> or <code>list(iterable)</code></li>
  </ul>
</blockquote>

<p>But it seems that using <code>list()</code> it uses more memory.</p>

<p>And as much <code>list</code> is bigger, the gap increases.</p>

<p><a href="https://i.stack.imgur.com/VVHJL.png"><img src="https://i.stack.imgur.com/VVHJL.png" alt="Difference in memory"></a></p>

<p>Why this happens?</p>

<p><strong>UPDATE #1</strong></p>

<p>Test with Python 3.6.0b2:</p>

<pre><code>Python 3.6.0b2 (default, Oct 11 2016, 11:52:53) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.getsizeof(list(range(100)))
1008
&gt;&gt;&gt; sys.getsizeof([i for i in range(100)])
912
</code></pre>

<p><strong>UPDATE #2</strong></p>

<p>Test with Python 2.7.12:</p>

<pre><code>Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.getsizeof(list(xrange(100)))
1016
&gt;&gt;&gt; sys.getsizeof([i for i in xrange(100)])
920
</code></pre>

<p>Thanks everyone for helping me to understand that awesome Python.</p>

<p>I don't want to make question that massive(that why i'm posting answer), just want to show and share my thoughts.</p>

<p>As @ReutSharabani noted correctly: "list() deterministically determines list size". You can see it from that graph.</p>

<p><a href="https://i.stack.imgur.com/JrqC9.png"><img src="https://i.stack.imgur.com/JrqC9.png" alt="graph of sizes"></a></p>

<p>When you <code>append</code> or using list comprehension you always have some sort of boundaries that extends when you reach some point. And with <code>list()</code> you have almost the same boundaries, but they are floating.</p>

<p><strong>UPDATE</strong></p>

<p>So thanks to @ReutSharabani, @tavo, @SvenFestersen</p>

<p>To sum up: <code>list()</code> preallocates memory depend on list size, list comprehension cannot do that(it requests more memory when it needed, like <code>.append()</code>). That's why <code>list()</code> store more memory.</p>

<p>One more graph, that show <code>list()</code> preallocate memory. So green line shows <code>list(range(830))</code> appending element by element and for a while memory not changing.</p>

<p><a href="https://i.stack.imgur.com/yoV85.png"><img src="https://i.stack.imgur.com/yoV85.png" alt="list() preallocates memory"></a></p>

<p><strong>UPDATE 2</strong></p>

<p>As @Barmar noted in comments below, <code>list()</code> must me faster than list comprehension, so i ran <code>timeit()</code> with <code>number=1000</code> for length of <code>list</code> from <code>4**0</code> to <code>4**10</code> and the results are</p>

<p><a href="https://i.stack.imgur.com/WNSnO.png"><img src="https://i.stack.imgur.com/WNSnO.png" alt="time measurements"></a></p>

python list list-comprehension