覆盖双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好的,谢谢。这就解决了问题。很抱歉问这个愚蠢的问题。我不知道为什么人们在这个问题上投了如此激烈的反对票,对新来者来说格式设置不是那么明显。顺便说一句,谢谢你的格式设置部分。下次我会努力做得更好;-)