区别
浅拷贝:只复制对象本身,对象中的引用类型保持共享欢喜。适用于对象比较浅或者嵌套层次不复杂的情况。
生拷贝:不仅复制对象本身,还地柜复制内部嵌套的引用对象,确保完全独立。适用于需要完全隔离两个对象的情况。
等号:是引用赋值,与深/浅拷贝不同的是,深/浅拷贝创建了新对象。
浅拷贝
浅拷贝创建一个新的对象,但对于对象中的可变引用类型(如列表、字典),它进复制引用,而不复制对象本身。
因此浅拷贝后的对象与源对象共享内部的可变对象。这意味着修改其中一个对象中的可变类型内容时,另一个对象也会受到影响。
import copy
original = [[1, 2, 3], 4, 5]
shallow_copy = copy.copy(original)
shallow_copy[0][0] = 'a'
print("原始对象:", original)
print("浅拷贝对象:", shallow_copy)

深拷贝
深拷贝不仅创建了一个新对象,而且对于对象中的所有嵌套对象(包括可变引用类型),它也会递归地复制一份新对象,而不是共享引用。
因此,深拷贝后的对象与原对象是完全独立的,即使修改其中一个对象中的嵌套对象,另一个对象也不会受到影响。
import copy
original = [[1, 2, 3], 4, 5]
deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 'b'
print("原始对象:", original)
print("深拷贝对象:", deep_copy)

等号
原创:有勇气的牛排
https://www.couragesteak.com/article/478
等号(=)赋值并不是一种拷贝操作,而是引用赋值。
当使用等号将一个对象赋值给另一个变量时,两个变量实际上共享同一个对象,即它们引用的是同一块内存地址。
因此修改其中一个变量的内容,另一个变量也会受到影响。
与深浅拷贝不同的是,深浅拷贝创建了新对象。
a = [1, 2, 3]
b = a
b[0] = '有勇气的牛排'
print("a: ", a)
print("b: ", b)

<h2><a id="_0"></a>区别</h2>
<p>浅拷贝:只复制对象本身,对象中的引用类型保持共享欢喜。适用于对象比较浅或者嵌套层次不复杂的情况。</p>
<p>生拷贝:不仅复制对象本身,还地柜复制内部嵌套的引用对象,确保完全独立。适用于需要完全隔离两个对象的情况。</p>
<p>等号:是引用赋值,与深/浅拷贝不同的是,深/浅拷贝创建了新对象。</p>
<h2><a id="_8"></a>浅拷贝</h2>
<p>浅拷贝创建一个新的对象,但对于对象中的<strong>可变引用类型(如列表、字典)</strong>,它进复制引用,而不复制对象本身。</p>
<p>因此浅拷贝后的对象与源对象<strong>共享</strong>内部的可变对象。这意味着修改其中一个对象中的可变类型内容时,另一个对象也会受到影响。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> copy
<span class="hljs-comment"># 原始对象</span>
original = [[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>], <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]
<span class="hljs-comment"># 浅拷贝</span>
shallow_copy = copy.copy(original)
<span class="hljs-comment"># 修改浅拷贝中的嵌套列表</span>
shallow_copy[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>] = <span class="hljs-string">'a'</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"原始对象:"</span>, original)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"浅拷贝对象:"</span>, shallow_copy)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/c9184b53141f067ac7929cde0b138b10.png" alt="Python浅拷贝案例" /></p>
<h2><a id="_32"></a>深拷贝</h2>
<p>深拷贝不仅创建了一个新对象,而且对于对象中的<strong>所有嵌套对象(包括可变引用类型)</strong>,它也会递归地复制一份新对象,而不是共享引用。</p>
<p>因此,深拷贝后的对象与原对象是<strong>完全独立</strong>的,即使修改其中一个对象中的嵌套对象,另一个对象也不会受到影响。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> copy
<span class="hljs-comment"># 原始对象</span>
original = [[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>], <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]
<span class="hljs-comment"># 深拷贝</span>
deep_copy = copy.deepcopy(original)
<span class="hljs-comment"># 修改 深拷贝中嵌套的列表</span>
deep_copy[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>] = <span class="hljs-string">'b'</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"原始对象:"</span>, original)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"深拷贝对象:"</span>, deep_copy)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/88e5e3bcd255306bbac3695ce11b550c.png" alt="Python深拷贝案例" /></p>
<h2><a id="_56"></a>等号</h2>
<p>原创:有勇气的牛排<br />
<a href="https://www.couragesteak.com/article/478" target="_blank">https://www.couragesteak.com/article/478</a></p>
<p><strong>等号(=)赋值并不是一种拷贝操作,而是引用赋值。</strong></p>
<p>当使用等号将一个对象赋值给另一个变量时,两个变量实际上<strong>共享同一个对象</strong>,即它们引用的是同一块内存地址。</p>
<p>因此修改其中一个变量的内容,另一个变量也会受到影响。</p>
<p>与深浅拷贝不同的是,深浅拷贝创建了新对象。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 原始对象</span>
a = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>]
<span class="hljs-comment"># 等号赋值</span>
b = a
<span class="hljs-comment"># 修改b</span>
b[<span class="hljs-number">0</span>] = <span class="hljs-string">'有勇气的牛排'</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">"a: "</span>, a)
<span class="hljs-built_in">print</span>(<span class="hljs-string">"b: "</span>, b)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/21b1bd4d475459d3e974b03c00f6dd29.png" alt="Python等号" /></p>
留言