我已经四处寻找并尝试了很多东西,但我无法让它发挥作用。我认为这个问题与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并且没有选择。
非常感谢您的帮助
答案 0 :(得分:4)
您需要知道可变元素和不可变元素之间的区别。也就是说,Python中的字典和列表都是 mutable 。这意味着如果你在一个地方修改它,它也会在另一个地方修改。
此外,可变类型的变量(如list
或dict
)可以包含不可变元素(例如str
),以及相反的方式:不可变的变量type(例如tuple
)可以包含可变元素(例如list
或dict
)。
因此,这显示了使用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是扁平的或仅包含可变元素,但可以按照我展示的方式进行复制,以获得更复杂的可变数据结构的副本,您需要做更多的事情......
在这种情况下,非常有用的可能是copy
模块及其deepcopy
function。 copy
模块的文档更多地说明了其目的:
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此可以更改一个副本而不更改另一个副本。该模块提供了通用的浅层和深层复制操作(如下所述)。
答案 1 :(得分:0)
您的dictionarymodifier
实际上是否变异dictionary2
了吗?如果是这样,您构建列表的方式就无关紧要了。
只需使用list_modified = list(list_original)
就可以正常创建列表的浅副本,然后您可以根据自己的内容进行修改,但前提是您不修改项目 原始列表(如果它们是不可变的内置函数,如数字或字符串,则不能这样,因此初学者经常将其误认为是深层复制品。)
如果您确实需要复制列表,可以使用copy.deepcopy
来执行此操作。
答案 2 :(得分:0)
您需要创建列表的副本。
copy=list(original)
original[0] = None