繁体   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