Python深浅拷贝
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>一、引言<ul><li>1.1、可变or不可变</li></ul></li><li>二、拷贝</li><li>三、浅拷贝</li><li>四、深拷贝</li></ul></div><br><span style="color: rgba(255, 0, 0, 1)">Python从入门到放弃完整教程目录:https://www.cnblogs.com/nickchen121/p/10718112.html</span><p></p>
<h1 id="一引言">一、引言</h1>
<p>在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用</p>
<p>针对该列表<code>l1=\\\['a','b','c',\\\['d','e','f'\\\]\\\]</code>一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝</p>
<p>注意:<strong style="color: rgba(255, 0, 0, 1)">拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的</strong></p>
<h2 id="11可变or不可变">1.1、可变or不可变</h2>
<p>id不变值可变,即在原值的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变数据类型。</p>
<pre><code class="language-python">age = 19
print(f'first:{id(age)}')
age = 20
print(f'second:{id(age)}')
</code></pre>
<pre><code class="language-default">first:4384901776
second:4384901808
</code></pre>
<h1 id="二拷贝">二、拷贝</h1>
<p><span style="color: rgba(255, 0, 0, 1)">如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。</span></p>
<pre><code class="language-python">l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1
l1.append('g')
print(l1)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f'], 'g']
</code></pre>
<pre><code class="language-python">print(l2)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f'], 'g']
</code></pre>
<h1 id="三浅拷贝">三、浅拷贝</h1>
<p><span style="color: rgba(255, 0, 0, 1)">如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。</span></p>
<pre><code class="language-python">import copy
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)
l1.append('g')
print(l1)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f'], 'g']
</code></pre>
<pre><code class="language-python">print(l2)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f']]
</code></pre>
<pre><code class="language-python">l1.append('g')
print(l1)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
</code></pre>
<pre><code class="language-python">print(l2)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f', 'g']]
</code></pre>
<h1 id="四深拷贝">四、深拷贝</h1>
<span style="color: rgba(255, 0, 0, 1)">
如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。</span>
<pre><code class="language-python">import copy
l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.deepcopy(l1)
l1.append('g')
print(l1)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f'], 'g']
</code></pre>
<pre><code class="language-python">print(l2)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f']]
</code></pre>
<pre><code class="language-python">l1.append('g')
print(l1)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']
</code></pre>
<pre><code class="language-python">print(l2)
</code></pre>
<pre><code class="language-default">['a', 'b', 'c', ['d', 'e', 'f']]
</code></pre><br><br>
来源:https://www.cnblogs.com/nickchen121/p/11069994.html
頁:
[1]