<p>这里重要的概念是<strong>引用</strong>。在Python中,变量是对内存中某个位置的对象的引用。让我们用箭头→来表示引用。变量→对象。变量在左边,对象在右边。在</p>
<p>数组可以可视化为三个变量,它们引用三个整数对象。在</p>
<pre><code>a[0] → int(1)
a[1] → int(2)
a[2] → int(3)
</code></pre>
<p>现在,整数对象是不可变的。他们不能改变。当你改变一个整型变量时,你并没有改变变量所指的对象。不能,因为<code>int</code>是不可变的。你能做的就是让变量引用一个不同的对象。在</p>
<h3>直接更新</h3>
<p>让我们先看看第二个循环,因为它更简单。如果直接更新数组会怎么样?在</p>
^{pr2}$
<p>首先让我们展开循环:</p>
<pre><code>a[0] += 1
a[1] += 1
a[2] += 1
</code></pre>
<p>对于整数,<code>a[0] += 1</code>相当于<code>a[0] = a[0] + 1</code>。首先,Python计算<code>a[0] + 1</code>并得到结果<code>int(2)</code>。然后它将<code>a[0]</code>改为引用<code>int(2)</code>。第二条和第三条语句的计算方式类似。在</p>
^{4}$
<h3>间接更新</h3>
<p>我称之为“间接”的更新呢?在</p>
<pre><code>for x in a:
x += 1
</code></pre>
<p>展开循环会产生一系列等效的语句:</p>
<pre><code>x = a[0]
x += 1
x = a[1]
x += 1
x = a[2]
x += 1
</code></pre>
<p>每一步都会发生什么,为什么数组没有改变?在</p>
<pre><code>x = a[0]
</code></pre>
<p>这使得<code>x</code>引用<code>a[0]</code>引用的任何对象。<code>a[0]</code>和<code>x</code>引用相同的<code>int(1)</code>对象,但是<code>x</code>没有直接连接到<code>a[0]</code>。它引用<code>a[0]</code>所指的任何内容,而不是{<cd6>}本身。在</p>
<pre><code>x += 1
</code></pre>
<p>这将改变<code>x</code>所指的内容。它对<code>a[0]</code>没有影响。在</p>
<p>第二次和第三次作业也是如此。结果是<code>x</code>是不断变化的,而{<cd20>}的元素仅仅是从中读取而从不被修改。因此,当循环终止时<code>a</code>不变。在</p>
<pre><code>a = [1, 2, 3] # a[0] → int(1)
# a[1] → int(2)
# a[2] → int(3)
x = a[0] # x → int(1)
x += 1 # x → int(2)
x = a[1] # x → int(2)
x += 1 # x → int(3)
x = a[2] # x → int(3)
x += 1 # x → int(4)
</code></pre>