<p>当您首先将<code>a</code>分配给<code>b</code>时,堆上只有一个实际的列表数据,您应该首先尝试将堆上的另一个列表数据分配给<code>b</code></p>
<p><img src="https://i.imgur.com/Wd43QZX.png" alt="Python Code"/></p>
<p>在您的示例中,当您第一次将<code>['h', 'e', 'l', 'l', 'o']</code>赋值给<code>a</code>时,您正在创建一个变量<code>a</code>,该变量指向堆上的实际列表数据。之后,将<code>a</code>赋值给<code>b</code>,这意味着创建一个变量<code>b</code>,指向<code>a</code>所指向的数据,现在结构如下所示:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'o']
^
|
b
</code></pre>
<p>然后,<code>b[-1] = 'q'</code>表示更改<code>b</code>指向的列表数据的最后一个元素,这将导致:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'q']
^
|
b
</code></pre>
<p>之后,<code>b[:] = a</code>表示将<code>b</code>所指向的列表的数据</strong>更改为<code>a</code>所指向的列表的数据</strong>,在这种情况下,该数据不起任何作用(<code>a</code>和<code>b</code>仍然指向相同的列表数据)。因此,下面的<code>a[-1] = 'Q'</code>和<code>b[-1] = 'o'</code>只是在更改(仅)列表数据,如下所示:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'Q']
^
|
b
</code></pre>
<pre><code>a -> ['h', 'e', 'l', 'l', 'o']
^
|
b
</code></pre>
<p>回到<code>b = a</code>和<code>b[:] = a</code>的区别,如果您想了解<code>b[:] = a</code>与<code>b = a</code>的区别,可以首先将<code>['h', 'e', 'l', 'l', 'o']</code>分配给<code>a</code>,然后将另一个列表<code>[]</code>分配给b,现在结构如下所示:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'o']
b -> []
</code></pre>
<p>然后,如果使用<code>b[:] = a</code>,将<code>b</code>指向的列表的数据更改为<code>a</code>指向的列表的数据,则会得到如下结构:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'o']
b -> ['h', 'e', 'l', 'l', 'o']
</code></pre>
<p>在此状态下,对<code>a</code>指向的列表所做的任何更改都不会影响<code>b</code>指向的列表。例如,现在使用<code>a[-1] = 'Q'</code>只会更改<code>a</code>指向的列表,这会导致如下结构:</p>
<pre><code>a -> ['h', 'e', 'l', 'l', 'Q']
b -> ['h', 'e', 'l', 'l', 'o']
</code></pre>