簡體   English   中英

如何更改列表中的元素,並保留原始列表的副本?

[英]How do I change an element in a list, and keep a copy of the original list?

我到處搜索並嘗試了很多東西,但無法正常工作。 我認為這個問題是事做Python列表名稱如何指向列表,而不是實際的名單,但我仍然無法弄清楚。 情況是這樣的(這是詞典列表):

list_original = [dictionary1, dictionary2, dictionary3]
dictionary2_modified = dictionarymodifier(dictionary2) #some function that modifies the chosen element
list_modified = [i for i in list_original] #makes copy of original list
for i,n in enumerate(dictionary_original):
    if i==1:
        list_modified[1] = dictionary2_modified #replaces element with modified version
return list_original, list_modified

和許多類似的事情一樣,但我總是會得到兩個原始列表或兩個新列表! 我補充說,我正在使用python 2.4,但沒有選擇。

非常感謝您的幫助

可變與不可變

您需要了解可變元素和不可變元素之間的區別。 即,Python中的字典和列表都是可變的 這意味着,如果您在一處修改它,那么它也會在另一處修改。

此外,可變類型的變量(例如listdict )可以包含不可變元素(例如str ),也可以采用其他方式:可變類型的變量(例如tuple )可以包含可變元素(例如listdict )。

可變性示例

因此,使用清單示例顯示了可變性:

>>> a = [1, 2, 3, 4]
>>> b = a
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> a[2] = 'x'
>>> a
[1, 2, 'x', 4]
>>> b
[1, 2, 'x', 4]

如何獲取列表或字典的副本

要獲取list的副本,您只需執行以下操作即可:

new_list = old_list[:]  # the slicing at the end just takes the whole list

如果有dict ,通常就足夠了:

new_dict = old_dict.copy()

嵌套列表/字典

但是,盡管列表/字典是平面的或僅包含可變元素,但是可以按照我所展示的方式進行復制,但要獲得更復雜的可變數據結構的副本,您還需要做更多的事情...

在這種情況下,具有deepcopy copy 功能copy模塊可能會很有幫助。 copy模塊的文檔詳細說明了其用途:

Python中的賦值語句不復制對象,它們在目標和對象之間創建綁定。 對於可變或包含可變項的集合,有時需要一個副本,因此一個副本可以更改一個副本而不更改另一個副本。 此模塊提供通用的淺層和深層復制操作(在下面說明)。

是您的dictionarymodifier實際上變異dictionary2到位? 如果是這樣,則建立列表的方式就無關緊要。

只需用list_modified = list(list_original)工作正常創建列表,然后你就可以修改你的心臟的內容的拷貝,但只有當你不修改原始列表中的項目(可以不若它們是數字或字符串之類的內置屬性,因此初學者經常將其誤認為是深層副本)。

如果確實需要復制列表,則可以使用copy.deepcopy進行復制。

您需要創建列表的副本。

copy=list(original)
original[0] = None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM