Python 创建列表副本的函数
我需要一个函数,将重置列表到其原始状态,所以为了做到这一点,我将使用列表的副本作为最直接的方式来实现它 每次我对列表或列表数量进行更改时,我都希望列表处于原始状态。由于列表的数量可能更大,我需要一个函数来处理它,而无需每次重新编写几行代码 我尝试创建一个函数,它只创建一个列表的副本,因此我可以使用它来获取原始列表的副本,以便进一步修改。 但是有一点我遗漏了,因为我遇到了错误:Python 创建列表副本的函数,python,Python,我需要一个函数,将重置列表到其原始状态,所以为了做到这一点,我将使用列表的副本作为最直接的方式来实现它 每次我对列表或列表数量进行更改时,我都希望列表处于原始状态。由于列表的数量可能更大,我需要一个函数来处理它,而无需每次重新编写几行代码 我尝试创建一个函数,它只创建一个列表的副本,因此我可以使用它来获取原始列表的副本,以便进一步修改。 但是有一点我遗漏了,因为我遇到了错误: list1=[1,2,3] list2=['a','b','c'] list3=[434,52,43] def cop
list1=[1,2,3]
list2=['a','b','c']
list3=[434,52,43]
def copy_lists():
list1c=list1[:]
list2c=list2[:]
list3c=list3[:]
copy_lists()
list1c.append('b')
copy_lists()
#now list1c should be back to orginal
print(list1c)
---------------------------------------------------------------------------
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-95468ead1e78> in <module>()
9
10 copy_lists()
---> 11 list1c.append('b')
12 copy_lists()
NameError: name 'list1c' is not defined
在python中,在复制对象时必须非常小心。如果执行list1c=list1和list1c.append'a'操作,list1也将附加'a'。这篇文章讨论了变量是指针还是来自另一个变量的数据的实际副本 确保修改对象副本不会更改原始对象的最佳方法是使用“复制”模块中的
from copy import deepcopy
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [434, 52, 43]
list1c = deepcopy(list1)
list2c = deepcopy(list2)
list3c = deepcopy(list3)
list1c.append('a')
print(list1c)
# list1 will not be modified if you change list1c
print(list1)
您现在遇到的错误是范围问题。当您试图在copy_lists函数之外使用list1c时,您试图访问其作用域之外的局部变量(在本例中为copy_lists函数)
如果您想在函数中进行复制,可以通过从copy_lists函数返回元组来实现
from copy import deepcopy
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [434, 52, 43]
# changed list1 to l1 to avoid having a variable in the inner scope shadow the outer scope
def copy_function(l1, l2, l3):
l1c = deepcopy(l1)
l2c = deepcopy(l2)
l3c = deepcopy(l3)
return l1c, l2c, l3c
list1c, list2c, list3c = copy_function(list1, list2, list3)
list1c.append('a')
print(list1c)
# list1 will not be modified if you change list1c
print(list1)
`list1c`是一个局部变量,仅在copy_列表中定义。Deepcopy可能会为您这样做:不要尝试使用这么多全局变量。将要复制的列表作为参数,并以元组或另一个列表的形式返回副本。您是否可以这样做,以使普通读者更清楚地了解为什么它不是的副本?我补充说,这里的要点是,我需要一个使用列表的副本方面的函数,并且该函数导致了问题。