如何在Python中复制在函数调用中不会更改的列表
我正在处理这些功能(请参阅): 我有一个列表,我想作为参数传递, 但我希望这份名单保持不变。我尝试的是:如何在Python中复制在函数调用中不会更改的列表,python,python-2.7,nested-lists,Python,Python 2.7,Nested Lists,我正在处理这些功能(请参阅): 我有一个列表,我想作为参数传递, 但我希望这份名单保持不变。我尝试的是: my_list = [[1], [1, 2], [1, 2, 3]] print my_list #[[1], [1, 2], [1, 2, 3]] copy_my_list = list (my_list) #This also fails #copy_my_list = my_list [:] print id (my_list) == id (copy_my_list) #Fal
my_list = [[1], [1, 2], [1, 2, 3]]
print my_list
#[[1], [1, 2], [1, 2, 3]]
copy_my_list = list (my_list)
#This also fails
#copy_my_list = my_list [:]
print id (my_list) == id (copy_my_list)
#False
print func (copy_my_list)
#[[1], [2], [3]]
print my_list
#[[1], [2], [3]]
但它确实改变了我原来的清单。
有什么想法吗?使用
copy.deepcopy
:
from copy import deepcopy
new_list = deepcopy([[1], [1, 2], [1, 2, 3]])
演示:
使用list(my_list)
和my_list[:]
都可以获得列表的浅拷贝
id(copy_my_list[0]) == id(my_list[0])
# True
因此,请使用copy.deepcopy
来避免您的问题:
copy_my_list = copy.deepcopy(my_list)
id(copy_my_list[0]) == id(my_list[0])
# False
使用元组<代码>我的列表=([1],[1,2],[1,2,3])
my_list
现在是不可变的,任何时候你想要一个可变的副本,你可以使用list(my_list)
正如有人提请我注意的那样,这个解决方案并非万无一失。元组本身是不可变的,但它的元素是可变的(如果它们是可变对象,那么哪些列表是可变的)。谢谢。你能告诉我为什么会发生这种事情吗?@pushpen.paul那是因为
[:]
和list()
只创建列表的浅拷贝,而内部列表仍然是同一个对象。您可以从my_list
或new_list
中更改它们。Funfact:元组中的列表仍然是可变的-因为它们是列表,所以这不会解决问题。您是否使用问题的函数func(listOfLists)尝试过?是的,该函数为我返回相同的列表(因为在函数中似乎什么都没有做)。所以我尝试对内部列表进行变异以确定。示例def doo_stuff(thing):thing[0][0]=“outch”请考虑换行符和其他内容,然后trow([1]、[1,2]、[1,2,3])进入该函数,看看会发生什么。哈哈,你是想烧死我吗?你是对的@RouvenB.,但我基于OP函数的答案仍然没有错。不过我会编辑我的答案。
id(copy_my_list[0]) == id(my_list[0])
# True
copy_my_list = copy.deepcopy(my_list)
id(copy_my_list[0]) == id(my_list[0])
# False
>>> my_list = ([1], [1, 2], [1, 2, 3])
>>> def mutate(aList):
aList.pop()
return aList
>>> mutate(list(my_list))
[[1], [1, 2]]
>>> my_list
([1], [1, 2], [1, 2, 3])
>>>