Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中复制在函数调用中不会更改的列表_Python_Python 2.7_Nested Lists - Fatal编程技术网

如何在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])
>>>