Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表列表更改第一个列表(即使在制作列表副本时)_Python_List_Recursion - Fatal编程技术网

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)))