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可能会为您这样做:不要尝试使用这么多全局变量。将要复制的列表作为参数,并以元组或另一个列表的形式返回副本。您是否可以这样做,以使普通读者更清楚地了解为什么它不是的副本?我补充说,这里的要点是,我需要一个使用列表的副本方面的函数,并且该函数导致了问题。