首頁 >後端開發 >Python教學 >為什麼 Python 賦值會在可變物件上顯示意外行為?

為什麼 Python 賦值會在可變物件上顯示意外行為?

DDD
DDD原創
2024-12-07 20:25:16487瀏覽

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Python 賦值中的複製行為

簡介

Python 是一種流行的程式語言運算,當透過賦值符(=) 將物件分配給變數。這種行為通常稱為複製,通常會導致意外結果。為了闡明這個概念,讓我們來看一個常見的例子。

問題:複製與複製

考慮以下程式碼:

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print(dict_a)
print(dict_b)
print(dict_c)

人們會期望這段程式碼建立三個獨立的字典,將將它們初始化為空,然後僅修改dict_c。預期的輸出應該是:

{}
{}
{'hello': 'goodbye'}

但是,Python 的複製行為會產生不同的結果:

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

解釋:引用賦值

理解這種行為的關鍵在於Python中變數的性質。在Python中,變數(或名稱)只是指向儲存在記憶體中的實際物件的指標。將一個變數指派給另一個變數時,賦值運算子 (=) 將記憶體位址(或指標)從一個變數複製到另一個變數。在我們的範例中:

dict_a = dict_b = dict_c

這意味著 dict_a、dict_b 和 dict_c 都指向記憶體中的同一個字典物件。因此,當 dict_c 被修改時,所有三個變數都會看到相同的修改,從而產生複製效果。

解決問題:使用複製方法

防止為了實現複製行為,必須明確建立基礎物件的副本。 Python 為此提供了兩種方法:

  • dict.copy():建立一個淺拷貝,複製字典的頂層元素。
  • copy.deepcopy():創建一個深層複製,遞歸複製對象內的所有嵌套對象

示例:

dict_a = dict_b.copy()
dict_c = copy.deepcopy(dict_a)

dict_c['hello'] = 'goodbye'

print(dict_a)  # {'hello': 'goodbye'} (shallow copy, affected)
print(dict_b)  # {} (unaffected)
print(dict_c)  # {'hello': 'goodbye'} (deep copy, unaffected)

透過使用這些複製方法,我們可以建立物件的獨立副本並避免複製行為。

以上是為什麼 Python 賦值會在可變物件上顯示意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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