Python 列表列表更改第一个列表(即使在制作列表副本时)
我试着做一个递归函数。一旦它附加第一个列表(Python 列表列表更改第一个列表(即使在制作列表副本时),python,list,recursion,Python,List,Recursion,我试着做一个递归函数。一旦它附加第一个列表(self.all_square.append(self.square.copy())),每当变量self.square发生干扰我的程序的变化时,复制的列表就会发生变化,导致它达到最大递归深度 我们将非常感谢您的帮助!谢谢。copy()不会创建深度副本。它创建一个浅层副本,这意味着结果是一个新列表,其中包含与原始列表相同的值。如果值具有引用类型,如列表和其他对象,则新列表将包含对原始列表引用的相同实例的引用 创建列表深度副本的最简单方法是使用函数map并
self.all_square.append(self.square.copy())
),每当变量self.square
发生干扰我的程序的变化时,复制的列表就会发生变化,导致它达到最大递归深度
我们将非常感谢您的帮助!谢谢。copy()
不会创建深度副本。它创建一个浅层副本,这意味着结果是一个新列表,其中包含与原始列表相同的值。如果值具有引用类型,如列表和其他对象,则新列表将包含对原始列表引用的相同实例的引用
创建列表深度副本的最简单方法是使用函数map
并从那里调用copy
def get_squares(self):
if self.check_full():
self.all_squares.append(self.square.copy())
while not self.is_placeable() or self.square in self.all_squares:
if self.square[self.i][self.j] == self.n * self.n:
self.go_back()
else:
self.square[self.i][self.j] += 1
if self.i != self.n - 1 or self.j != self.n - 1:
self.go_forward()
self.get_squares()
return self.all_squares
在您的具体情况下:
deepcopy = list(map(lambda x: x.copy(), original))
但是,请把列表(map(…)
东西放到它自己的方法中,因为像这样,行不是很可读^^
调用
list
并将map
的结果作为参数是必要的,因为map不返回列表而是一个序列。所有方格中对象的数据类型是什么id?@balderman all_square是一个“方格”列表,而一个方格是一个二维整数列表。查看深度副本
self.all_squares.append(list(map(lambda x: x.copy(), self.square)))