擅长:python、mysql、java
<p>Python变量包含指向对象的指针或引用。所有值(甚至整数)都是对象,赋值将变量更改为指向不同的对象。它不会在变量中存储新值<em>,它会将变量更改为引用或指向不同的对象。由于这个原因,许多人说Python没有“变量”,它有“名称”,而<code>=</code>操作不是“为变量赋值”,而是“将名称绑定到对象”</p>
<p>在<code>plusOne</code>中,您正在修改(或“变异”)<code>y</code>的<em>内容</em>,但永远不会更改<code>y</code>本身所指的内容。它始终指向同一个列表,即您传递给函数的列表。全局变量<code>y</code>和局部变量<code>y</code>引用同一列表,因此使用这两个变量可以看到更改。由于更改了传入对象的内容,实际上没有理由返回<code>y</code>(事实上,返回<code>None</code>正是Python本身对这样修改列表“就地”的操作所做的——值由创建新对象的操作返回,而不是对现有对象进行变异)。</p>
<p>在<code>plusOne2</code>中,您正在更改局部变量<code>a</code>,以引用另一个整数对象<code>3</code>。(“将名称<code>a</code>绑定到对象<code>3</code>。”)全局变量<code>a</code>不会因此而更改,而是继续指向<code>2</code>。</p>
<p>如果不想更改传入的列表,请复制并更改该列表。然后,您的函数应该返回新列表,因为它是创建新对象的操作之一,如果不返回新对象,新对象将丢失。您可以在函数的第一行执行此操作:<code>x = x[:]</code>例如(正如其他人指出的那样)。或者,如果让函数以任何一种方式调用都是有用的,那么如果他想要复制,您可以让调用方传入<code>x[:]</code>。</p>