<p>在您的功能中有两种不同的情况:</p>
<pre><code>def altera(L1, L2):
for elemento in L2:
L1.append(elemento)
# [1] this ^ alters L1 in place
L2 = L2 + [4]
# [2] this ^ creates a new list
L1[-1] = 10
del L2[0]
return L2[:]
</code></pre>
<p>要扩展我添加的内联注释:</p>
<ol>
<li>在<code>altera</code>内,变量<code>L1</code><em>是您传入的任何内容(因此它是</em><code>Lista1</code>)。它不是一个<em>拷贝</em>,一个具有相同内容的新列表-它引用了相同的实际对象</li>
<li><p>当你分配<code>L2 = L2 + [4]</code>时,你要做两件事:</p>
<ol>
<li>使用值<code>L2 + [4]</code>创建一个新列表</li>
<li>设置<code>L2</code>指向这个新列表,而不是您传入的任何内容</li>
</ol>
<p>如果我们重新命名变量,它将变得显式,并且工作方式与<em>完全相同:</p>
^{pr2}$
<p>或者,如果您想在适当的地方修改原始的<code>L2</code>(即,实际修改<code>Lista2</code>),您可以这样做</p>
<pre><code>L2.append(4)
del L2[0]
return L2[:]
</code></pre>
<p>注意最后一行仍然意味着<code>Lista3</code>将是<code>Lista2</code>不同的列表对象,但它将具有相同的值。如果您只是<code>return L2</code>,<code>Lista3</code>将与<code>L2</code>完全相同,因此它们将是同一列表对象的两个名称。</p></li>
</ol>
<p>如果您想<em>防止</em>这种行为,可以如下调用<code>altera</code>:</p>
<pre><code>Lista3 = altera(Lista1[:], Lista2[:])
</code></pre>
<p>现在,在<code>altera</code>内部,它将处理自己的参数副本,并且不会影响原始的<code>Lista1</code>和{<cd8>}。在</p>