<blockquote>
<p>y is reassigned to a new list</p>
</blockquote>
<p>不,代码中只有一个<code>y = ...</code>赋值。你知道吗</p>
<p>执行函数时会发生以下情况:</p>
<pre><code># implicitly: assign formal parameter name to actual argument value
p = y
# compute p + [1] => [2, 5, 1]
# assign the result to the name p
p = p + [1]
# aaaand... nothing from here on.
</code></pre>
<p>因此,您的函数计算一个结果(一个新列表),在函数作用域内指定名称<code>p</code>,然后一旦函数退出<code>p</code>就会丢失。你知道吗</p>
<p>如果您不想编写一个使输入列表变异的函数,您需要返回计算值并重新指定名称<code>y</code>,以查看所需的效果。你知道吗</p>
<pre><code>>>> def proc2(p):
... p = p + [1]
... return p
...
>>> y = [2,5]
>>> y = proc2(y)
>>> y
[2, 5, 1]
</code></pre>
<p>请注意,即使您<em>在函数中有</em>一个<code>y = ...</code>赋值,该名称也是函数的本地名称,外部作用域也不会在意:</p>
<pre><code>>>> def proc2(y):
... y = y + [1]
...
>>> y = [2,5]
>>> proc2(y)
>>> y
[2, 5]
</code></pre>
<p>最后,您可以告诉Python您指的是函数体中的全局<code>y</code>,但这被认为是糟糕的风格(在这里和大多数其他情况下都是如此)。你知道吗</p>
<pre><code>>>> def proc2():
... global y
... y = y + [1]
...
>>> y = [2,5]
>>> proc2()
>>> y
[2, 5, 1]
</code></pre>