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

时间:2013-01-29 20:27:59

标签: python

我已经四处寻找并尝试了很多东西,但我无法让它发挥作用。我认为这个问题与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并且没有选择。

非常感谢您的帮助

3 个答案:

答案 0 :(得分:4)

可变与不可变

您需要知道可变元素和不可变元素之间的区别。也就是说,Python中的字典和列表都是 mutable 。这意味着如果你在一个地方修改它,它也会在另一个地方修改。

此外,可变类型的变量(如listdict)可以包含不可变元素(例如str),以及相反的方式:不可变的变量type(例如tuple)可以包含可变元素(例如listdict)。

可变性的例子

因此,这显示了使用list的例子的可变性:

>>> 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()

嵌套列表/ dicts

然而,尽管列表/ dicts是扁平的或仅包含可变元素,但可以按照我展示的方式进行复制,以获得更复杂的可变数据结构的副本,您需要做更多的事情......

在这种情况下,非常有用的可能是copy模块及其deepcopy functioncopy模块的文档更多地说明了其目的:

  

Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。

答案 1 :(得分:0)

您的dictionarymodifier实际上是否变异dictionary2了吗?如果是这样,您构建列表的方式就无关紧要了。

只需使用list_modified = list(list_original)就可以正常创建列表的副本,然后您可以根据自己的内容进行修改,但前提是您不修改项目 原始列表(如果它们是不可变的内置函数,如数字或字符串,则不能这样,因此初学者经常将其误认为是深层复制品。)

如果您确实需要复制列表,可以使用copy.deepcopy来执行此操作。

答案 2 :(得分:0)

您需要创建列表的副本。

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