This commit is contained in:
krahets
2024-12-01 03:03:44 +08:00
parent 10cb7f0e26
commit 4c422f56cf
14 changed files with 336 additions and 326 deletions

View File

@@ -3705,8 +3705,13 @@
<li>缓存不友好:由于数据不是连续存放的,因此 <code>std::list</code> 对缓存的利用率较低。一般情况下,<code>std::vector</code> 的性能会更好。</li>
</ul>
<p>另一方面,必要使用链表的情况主要是二叉树和图。栈和队列往往会使用编程语言提供的 <code>stack</code><code>queue</code> ,而非链表。</p>
<p><strong>Q</strong>初始化列表 <code>res = [0] * self.size()</code> 操作,会导致 <code>res</code>每个元素引用相同的地址吗?</p>
<p>会。但二维数组会有这个问题,例如初始化二维列表 <code>res = [[0]] * self.size()</code> ,则多次引用了同一个列表 <code>[0]</code> </p>
<p><strong>Q</strong>操作 <code>res = [[0]] * n</code> 生成了一个二维列表,其中每一个 <code>[0]</code> 都是独立的吗?</p>
<p>是独立的。此二维列表中,所有的 <code>[0]</code> 实际上是同一个对象的引用。如果我们修改其中一个元素,会发现所有的对应元素都会随之改变</p>
<p>如果希望二维列表中的每个 <code>[0]</code> 都是独立的,可以使用 <code>res = [[0] for _ in range(n)]</code> 来实现。这种方式的原理是初始化了 <span class="arithmatex">\(n\)</span> 个独立的 <code>[0]</code> 列表对象。</p>
<p><strong>Q</strong>:操作 <code>res = [0] * n</code> 生成了一个列表,其中每一个整数 0 都是独立的吗?</p>
<p>在该列表中,所有整数 0 都是同一个对象的引用。这是因为 Python 对小整数(通常是 -5 到 256采用了缓存池机制以便最大化对象复用从而提升性能。</p>
<p>虽然它们指向同一个对象,但我们仍然可以独立修改列表中的每个元素,这是因为 Python 的整数是“不可变对象”。当我们修改某个元素时,实际上是切换为另一个对象的引用,而不是改变原有对象本身。</p>
<p>然而,当列表元素是“可变对象”时(例如列表、字典或类实例等),修改某个元素会直接改变该对象本身,所有引用该对象的元素都会产生相同变化。</p>
<!-- Source file information -->