创建列表副本的函数

2024-06-28 19:54:45 发布

您现在位置: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

Tags: 函数列表数量状态方式副本lists重置
1条回答
网友
1楼 · 发布于 2024-06-28 19:54:45

在python中,在复制对象时必须非常小心。如果执行list1c = list1list1c.append('a'),list1还将附加“a”Here是一篇讨论变量何时是指针,何时是另一个变量数据的实际副本的文章

确保修改对象副本不会更改原始副本的最佳方法是使用copy模块中的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\u lists函数)Here is some reading about scoping in python.

如果您想在函数中进行复制,可以从copy\u 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)

相关问题 更多 >