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
@@ -3648,8 +3648,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 -->