<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Computer Science on Nelson Figueroa</title><link>https://nelson.cloud/categories/computer-science/</link><description>Recent content in Computer Science on Nelson Figueroa</description><image><title>Nelson Figueroa</title><url>https://nelson.cloud/opengraph-images/default.png</url><link>https://nelson.cloud/opengraph-images/default.png</link></image><language>en</language><lastBuildDate>Sat, 28 Mar 2026 23:55:38 -0700</lastBuildDate><atom:link href="https://nelson.cloud/categories/computer-science/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Actually Copy a List in Python</title><link>https://nelson.cloud/how-to-actually-copy-a-list-in-python/?ref=rss</link><pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate><guid>https://nelson.cloud/how-to-actually-copy-a-list-in-python/?ref=rss</guid><description>Copy a list in Python using the copy() method, not the assignment operator.</description><content:encoded><![CDATA[<blockquote><p><strong>tl;dr:</strong></p><p>Use the <code>copy()</code> method.</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="n">list_b</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span></span></span></code></pre></div><p>If the list has other lists in it, import <code>copy</code> and use <code>copy.deepcopy()</code> to get fully independent lists.</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">copy</span>
</span></span><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span></span></span></code></pre></blockquote>

<h2 id="simple-lists">Simple Lists</h2>
<p>Say we have two Python lists &ndash; <code>list_a</code> and <code>list_b</code>.</p>
<p>If we try to make a copy of <code>list_a</code> and assign it to <code>list_b</code> using the assignment operator <code>=</code>, what really happens is that both <code>list_a</code> and <code>list_b</code> point to the same memory address.</p>
<p>That means that any list-manipulating actions that are done on either <code>list_a</code> or <code>list_b</code> will affect the same list in memory. We don&rsquo;t actually have two separate lists we can act upon.</p>
<p>In the example below, although we append the integer <code>4</code> to <code>list_a</code>, we can see that printing out <code>list_b</code> shows the newly added element. That&rsquo;s because both list variables point to the same memory address:</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="n">list_a</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span> <span class="c1"># [1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span> <span class="c1"># [1, 2, 3, 4]</span></span></span></code></pre></div><p>Output of the program above:</p>
<div class="highlight"><span class="code-lang">Text</span><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[1, 2, 3]
</span></span><span class="line"><span class="cl">[1, 2, 3, 4]</span></span></code></pre></div><p>To make an actual copy, use the <code>copy()</code> method. Then, when <code>list_a</code> is modified, it is independent of <code>list_b</code>, because <code>list_b</code> is stored in a separate memory address.</p>
<p>Now if we append the same integer <code>4</code> to <code>list_a</code>, <code>list_b</code> will be completely unaffected.</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="n">list_a</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="c1"># using copy()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span> <span class="c1"># [1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">list_a</span><span class="p">)</span> <span class="c1"># [1, 2, 3, 4]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span> <span class="c1"># [1, 2, 3]</span></span></span></code></pre></div><p>Output of the program above:</p>
<div class="highlight"><span class="code-lang">Text</span><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[1, 2, 3]
</span></span><span class="line"><span class="cl">[1, 2, 3, 4]
</span></span><span class="line"><span class="cl">[1, 2, 3]</span></span></code></pre></div><p>Here&rsquo;s more proof. We can print out the memory address of each variable to see when they&rsquo;re the same and when they differ. We can do this using the <code>id()</code> function.</p>
<p>Here are the same lists from above but this time with their unique identifiers printed out. In this case, the IDs match because both <code>list_a</code> and <code>list_b</code> point to the same memory address.</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="n">list_a</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;list_a address: </span><span class="si">{</span><span class="nb">id</span><span class="p">(</span><span class="n">list_a</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;list_b address: </span><span class="si">{</span><span class="nb">id</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span></span></span></code></pre></div><p>The program above outputs:</p>
<div class="highlight"><span class="code-lang">Text</span><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">list_a address: 140226819497536
</span></span><span class="line"><span class="cl">list_b address: 140226819497536</span></span></code></pre></div><p>The memory addresses are the same.</p>
<p>Now let&rsquo;s try the same thing but using the <code>copy()</code> method instead of just an assignment operation with <code>=</code>:</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="n">list_a</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;list_a address: </span><span class="si">{</span><span class="nb">id</span><span class="p">(</span><span class="n">list_a</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;list_b address: </span><span class="si">{</span><span class="nb">id</span><span class="p">(</span><span class="n">list_b</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span></span></span></code></pre></div><p>The program above outputs:</p>
<div class="highlight"><span class="code-lang">Text</span><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">list_a address: 140264515620480
</span></span><span class="line"><span class="cl">list_b address: 140264514892160</span></span></code></pre></div><p>We can see the memory addresses are different (most obvious due to the ending digits).</p>
<h2 id="lists-containing-lists-dictionaries-and-sets">Lists Containing Lists, Dictionaries, and Sets</h2>
<p>If a list contains other lists, dictionaries, or sets, the <code>copy()</code> method won&rsquo;t work as expected. The nested lists/dictionaries/sets will still be shared between both lists.</p>
<p>In this scenario, we need to import the <code>copy</code> module and use <code>copy.deepcopy()</code> so that lists/dictionaries/sets inside a list are actually copied to another list.</p>
<div class="highlight"><span class="code-lang">Python</span><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">copy</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">list_a</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">{</span><span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">}]</span>
</span></span><span class="line"><span class="cl"><span class="n">list_b</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">list_a</span><span class="p">)</span></span></span></code></pre></div><p>Although I&rsquo;ve been in the field for some time, I still have my smooth brain moments. This is a reminder to myself (and whoever reads this) to remember the basics!</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://www.geeksforgeeks.org/python/python-list-copy-method/" target="_blank" rel="noopener">https://www.geeksforgeeks.org/python/python-list-copy-method/</a></li>
<li>

<a href="https://www.geeksforgeeks.org/python/id-function-python/" target="_blank" rel="noopener">https://www.geeksforgeeks.org/python/id-function-python/</a></li>
</ul>
]]></content:encoded></item></channel></rss>