2017-10-17 53 views
0

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

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

我试图做一个函数,只是简单地创建一个列表的副本,因此我可以用它来获得一个原始列表的副本进一步的改动。 但有件事,我很想念,因为即时得到错误:

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 
+0

'list1c'是一个局部变量,只在'copy_lists'内定义。 –

+1

深度拷贝可能会为您做到这一点:https://docs.python.org/3.6/library/copy.html –

+0

不要(尝试)使用如此多的全局变量。以列表形式作为参数进行复制,然后将这些副本返回到一个元组(或另一个列表)中。 – chepner

回答

1

在Python有可能使对象的副本时要非常小心。如果你做list1c = list1list1c.append('a') list1也会附加'a'。 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)