 <blockquote> <p>But why does writing to the index of "b" change the id.</p> </blockquote> <p>Because they're different things now. If you were to check <code>a</code>, <code>a[0]</code> is still <code>1</code> rather than <code>99</code> because <code>b</code> was a copy. If you didn't want this behavior, you wouldn't do the copy:</p> <pre><code>&gt;&gt;&gt; a = [1,2,3] &gt;&gt;&gt; b = a &gt;&gt;&gt; b[0] = 99 &gt;&gt;&gt; a[0] 99 </code></pre> <p>instead, you have this:</p> <pre><code>&gt;&gt;&gt; a = [1,2,3] &gt;&gt;&gt; b = a[:] &gt;&gt;&gt; b[0] = 99 &gt;&gt;&gt; a[0] 1 </code></pre> <p>Since you tagged <code>deepcopy</code>...it's something that only matters if your lists themselves contain mutable arguments. Say, for instance, you had:</p> <pre><code>&gt;&gt;&gt; from copy import deepcopy &gt;&gt;&gt; a = [[1,2],[3,4]] &gt;&gt;&gt; b = a &gt;&gt;&gt; c = a[:] &gt;&gt;&gt; d = deepcopy(a) </code></pre> <p>So <code>a</code> is <code>b</code>, <code>c</code> is a shallow copy, and <code>d</code> is a deep copy.</p> <pre><code>&gt;&gt;&gt; b[0] = 3 &gt;&gt;&gt; a [3, [3,4]] &gt;&gt;&gt; c [[1,2], [3,4]] &gt;&gt;&gt; d [[1,2], [3,4]] </code></pre> <p><code>b</code> is the same as <code>a</code>, but the copies were unaffected.</p> <pre><code>&gt;&gt;&gt; c[1][1] = 'hi' &gt;&gt;&gt; a [3, [3, 'hi']] &gt;&gt;&gt; c [[1, 2], [3, 'hi']] </code></pre> <p>If you replace the entries of <code>c</code>, <code>a</code> is unaffected. But if you still have the original lists <em>within</em> the entries, modifying one still shows up in the other. The nested lists are still the same.</p> <pre><code>&gt;&gt;&gt; d[1][1] = 10 &gt;&gt;&gt; a [3, [3, 'hi']] &gt;&gt;&gt; d [[1, 2], [3, 10]] </code></pre> <p>Since <code>d</code> was a deep copy, it copied the list as well as its nested lists, so we can modify it <em>and its elements</em> at will without worry about messing up the other copies.</p>