可以创建列表副本的函数

时间:2017-10-17 21:37:05

标签: python

我需要一个将列表重置为原始状态的函数,所以为了做到这一点,我会使用列表副本作为实现它的最直接的方法。

每次我对列表(或列表数量)进行更改时,我希望列表处于原始状态。由于列表的数量可以更大,我需要一个可以处理它的函数,而不必每次都重复几行代码。

我尝试创建一个只创建列表副本的函数,因此我可以使用它来获取原始列表的副本以进行进一步的更改。 但是有些东西我错过了,因为我得到了错误:

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

1 个答案:

答案 0 :(得分:1)

在python中,你必须在制作对象副本时要非常小心。如果您list1c = list1list1c.append('a'),则list1也会有{&1;}&#39;附加到它。 Here是一篇文章,讨论变量是指针与来自另一个变量的数据的实际副本。

确保修改对象副本不会更改原始对象的最佳方法是使用复制模块中的deepcopy function

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函数)。 Here is some reading about scoping in python.

如果你想在函数中进行复制,可以通过从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)