覆盖双for循环函数(Python)中的列表 让我们考虑一下下面的数组: arr1 = [[1,1],[2,1]]

覆盖双for循环函数(Python)中的列表 让我们考虑一下下面的数组: arr1 = [[1,1],[2,1]],python,arrays,Python,Arrays,现在,我构造以下函数: def func(mylist): print(mylist)

现在,我构造以下函数:

def func(mylist):                                                                                                                                             
    print(mylist)                                                                                                                                             
    List = list(mylist)                                                                                                                                       
    for i in range(2):                                                                                                                                        
        for j in range(2):                                                                                                                                    
            List[i][j]=0                                                                                                                                      
    print mylist                                                                                                                                              
    print List                                                                                                                                                
    return mylist            
然后,当我在我的arr1上调用我的函数时,初始数组被修改(mylist)。 这真是奇怪的行为,因为我正在复制mylist,而且
修改复制的数组列表。有人能向我解释发生了什么事吗

我不知道为什么人们对这个问题投了否决票,因为这是很有道理的

现在,考虑一下:

>>> mylist1 = [(1,2), (3,4)]
>>> mylist2 = list(mylist1)

>>> mylist1
[(1, 2), (3, 4)]
>>> mylist2
[(1, 2), (3, 4)]

>>> mylist2[0] = (0, 0)

>>> mylist1
[(1, 2), (3, 4)]
>>> mylist2
[(0, 0), (3, 4)]
如您所见,
list()
创建列表的副本,但此副本不是“深度”副本,如果列表包含可变对象(列表、词典或对象),则副本将只复制对这些对象的引用,而不是这些对象上的内容。例如:

>>> mylist1 = [[1,2], [3,4]]
>>> mylist2 = list(mylist1)
>>> mylist2[0][0] = 0
>>> mylist2
[[0, 2], [3, 4]]
>>> mylist1
[[0, 2], [3, 4]]
这是因为对第一个元素列表的引用被复制到了新列表中,而不是它的内容或列表的完整副本,它仍然是相同的列表

如前所述,使用
copy.deepcopy

你可以在那里阅读:

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

  • 浅复制构造一个新的复合对象,然后(尽可能)向其中插入对原始对象的引用
  • 深度副本构造一个新的复合对象,然后递归地将在原始副本中找到的对象的副本插入其中
特殊情况下的另一种选择是使用如下列表:

>>> mylist1 = [[1,2], [3,4]]
>>> mylist2 = [list(elem) for elem in mylist1] # < This one
>>> mylist1
[[1, 2], [3, 4]]
>>> mylist2
[[1, 2], [3, 4]]
>>> mylist2[0][0] = 0
>>> mylist1
[[1, 2], [3, 4]]
>>> mylist2
[[0, 2], [3, 4]]
mylist1=[[1,2],[3,4]] >>>mylist2=[mylist1中元素的列表(元素)]#<这一个 >>>mylist1 [[1, 2], [3, 4]] >>>mylist2 [[1, 2], [3, 4]] >>>mylist2[0][0]=0 >>>mylist1 [[1, 2], [3, 4]] >>>mylist2 [[0, 2], [3, 4]]
这也将复制作为元素的列表。

list()
仅创建浅层副本,请使用
copy.deepcopy
。您的缩进和命名遍布整个列表place@Ashwini好的,谢谢。这就解决了问题。很抱歉问这个愚蠢的问题。我不知道为什么人们在这个问题上投了如此激烈的反对票,对新来者来说格式设置不是那么明显。顺便说一句,谢谢你的格式设置部分。下次我会努力做得更好;-)