簡介
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_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中文網其他相關文章!