3

我四处搜索并尝试了很多东西,但我无法让它工作。我认为问题与 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 并且没有选择。

非常感谢您的帮助

4

3 回答 3

6

可变与不可变

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

此外,可变类型的变量(例如listor dict)可以包含不可变元素(例如str),反之亦然:不可变类型的变量(例如tuple)可以包含可变元素(例如listor dict)。

可变性示例

因此,这使用列表的示例显示了可变性:

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

嵌套列表/字典

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

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

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

于 2013-01-29T20:38:07.900 回答
0

你的dictionarymodifier变异真的dictionary2到位了吗?如果是这样,那么您构建列表的方式就无关紧要了。

简单地使用list_modified = list(list_original)可以很好地创建列表的 浅表副本,然后您可以根据自己的意愿对其进行修改,但前提是您不修改原始列表的项目(如果它们是不可变的内置项,则不能修改 -像数字或字符串这样的东西,所以初学者经常把它误认为是深拷贝)。

如果你真的需要复制列表,你可以使用copy.deepcopy它来做。

于 2013-01-29T20:39:09.147 回答
0

您需要创建列表的副本。

copy=list(original)
original[0] = None
于 2013-01-29T20:39:19.823 回答