首頁  >  文章  >  後端開發  >  為什麼具有可變值的“dict.fromkeys”會建立共享物件?

為什麼具有可變值的“dict.fromkeys”會建立共享物件?

Susan Sarandon
Susan Sarandon原創
2024-10-26 03:16:27142瀏覽

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

使用fromkeys 建立可變物件和字典

使用dict.fromkeys 建立具有可變物件(例如列表)的字典時觀察到的行為,一開始可能會令人驚訝。以下範例示範了這個問題:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>

在本例中,我們建立一個包含兩個鍵(0 和 1)的字典,每個值都有一個空列表。但是,當我們將一個元素追加到與鍵 0 關聯的清單時,它也會出現在與鍵 1 關聯的清單中。

要理解此行為,請務必注意 dict.fromkeys 共享相同的值物件所有鍵之間。在我們的範例中,xs[0] 和xs[1] 都指向同一個列表對象,如下所示:

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>

因此,透過xs[0] 對列表所做的任何修改也會反映出來在xs[1] 中,因為它們引用相同的底層物件。

相反,使用字典理解創建包含可變對象的字典會導致每個值都是一個單獨的對象:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>

在這種情況下,xs[0]和xs[1]不是同一個對象,因此修改xs[0]不會影響xs[1]。

在Python 2.6或更早版本中,當字典推導式不可用,您可以使用帶有 dict() 的生成器表達式來實現與字典理解相同的行為:

<code class="python">xs = dict((i, []) for i in range(2))</code>

以上是為什麼具有可變值的“dict.fromkeys”會建立共享物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn