Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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 - Fatal编程技术网

Python列表中不需要的行为

Python列表中不需要的行为,python,Python,我试图将矩阵表示为列表列表,并根据矩阵中的位置是否满足某些条件,使用值填充它。我存储它的变量是self.\u solution 为了继续,我采取了两种不同的方法: 方法1: def __init__(self, N=3, puzzle=None): self.N = N self.SIZE = self.N*self.N self.puzzle = [[set([1])]*(self.SIZE)]*(self.SIZE) if pu

我试图将矩阵表示为列表列表,并根据矩阵中的位置是否满足某些条件,使用值填充它。我存储它的变量是
self.\u solution

为了继续,我采取了两种不同的方法: 方法1:

def __init__(self, N=3, puzzle=None):
        self.N = N
        self.SIZE = self.N*self.N
        self.puzzle = [[set([1])]*(self.SIZE)]*(self.SIZE)
        if puzzle is None:
            for i in range(self.SIZE):
                self.puzzle[i] = [int(k) for k in raw_input()]
        else:
            self.puzzle = [[int(k) for k in line] for line in puzzle.splitlines()]

        self._empty_cells = 0    
        self._solutions = [[0]*(self.SIZE)]*(self.SIZE)
        self._solutions = []
        print self.puzzle
        print self._solutions
        for i in range(self.SIZE):
            self._solutions.append([])
            for j in range(self.SIZE):
                if self.puzzle[i][j] < 1:
                    #self._solutions[i][j] = set(range(1,self.SIZE+1))
                    self._solutions[i].append(1)
                    self._empty_cells += 1
                    print "puzzle[%s][%s] = %s\tsolutions[%s][%s] = %s" % (i,j, self.puzzle[i][j], i, j, self._solutions[i][j])
                else:
                    self._solutions[i].append(0)
        print self._solutions
def __init__(self, N=3, puzzle=None):
        self.N = N
        self.SIZE = self.N*self.N
        self.puzzle = [[set([1])]*(self.SIZE)]*(self.SIZE)
        if puzzle is None:
            for i in range(self.SIZE):
                self.puzzle[i] = [int(k) for k in raw_input()]
        else:
            self.puzzle = [[int(k) for k in line] for line in puzzle.splitlines()]

        self._empty_cells = 0    
        self._solutions = [[0]*(self.SIZE)]*(self.SIZE)
        #self._solutions = []
        print self.puzzle
        print self._solutions
        for i in range(self.SIZE):
            #self._solutions.append([])
            for j in range(self.SIZE):
                if self.puzzle[i][j] < 1:
                    #self._solutions[i][j] = set(range(1,self.SIZE+1))
                    self._solutions[i][j] = 1
                    #self._solutions[i].append(1)
                    self._empty_cells += 1
                    print "puzzle[%s][%s] = %s\tsolutions[%s][%s] = %s" % (i,j, self.puzzle[i][j], i, j, self._solutions[i][j])
        print self._solutions
def\uuuu init\uuuu(self,N=3,puzzle=None):
self.N=N
self.SIZE=self.N*self.N
self.puzzle=[[set([1])]*(self.SIZE)]*(self.SIZE)
如果谜题为“无”:
对于范围内的i(自身尺寸):
self.puzzle[i]=[int(k)表示原始输入()中的k]
其他:
self.puzzle=[[int(k)表示行中的k]表示行中的puzzle.splitlines()]
self.\u空\u单元格=0
self._solutions=[[0]*(self.SIZE)]*(self.SIZE)
自我解决方案=[]
打印自我拼图
打印自我解决方案
对于范围内的i(自身尺寸):
self.\u solutions.append([])
对于范围内的j(自身尺寸):
如果self.puzzle[i][j]<1:
#self._解[i][j]=集合(范围(1,self.SIZE+1))
self.\u解决方案[i].附加(1)
自身。_空_单元格+=1
打印“拼图[%s][%s]=%s\t解决方案[%s][%s]=%s”%(i,j,self.puzzle[i][j],i,j,self.\u解决方案[i][j])
其他:
self.\u解决方案[i]。追加(0)
打印自我解决方案
方法2:

def __init__(self, N=3, puzzle=None):
        self.N = N
        self.SIZE = self.N*self.N
        self.puzzle = [[set([1])]*(self.SIZE)]*(self.SIZE)
        if puzzle is None:
            for i in range(self.SIZE):
                self.puzzle[i] = [int(k) for k in raw_input()]
        else:
            self.puzzle = [[int(k) for k in line] for line in puzzle.splitlines()]

        self._empty_cells = 0    
        self._solutions = [[0]*(self.SIZE)]*(self.SIZE)
        self._solutions = []
        print self.puzzle
        print self._solutions
        for i in range(self.SIZE):
            self._solutions.append([])
            for j in range(self.SIZE):
                if self.puzzle[i][j] < 1:
                    #self._solutions[i][j] = set(range(1,self.SIZE+1))
                    self._solutions[i].append(1)
                    self._empty_cells += 1
                    print "puzzle[%s][%s] = %s\tsolutions[%s][%s] = %s" % (i,j, self.puzzle[i][j], i, j, self._solutions[i][j])
                else:
                    self._solutions[i].append(0)
        print self._solutions
def __init__(self, N=3, puzzle=None):
        self.N = N
        self.SIZE = self.N*self.N
        self.puzzle = [[set([1])]*(self.SIZE)]*(self.SIZE)
        if puzzle is None:
            for i in range(self.SIZE):
                self.puzzle[i] = [int(k) for k in raw_input()]
        else:
            self.puzzle = [[int(k) for k in line] for line in puzzle.splitlines()]

        self._empty_cells = 0    
        self._solutions = [[0]*(self.SIZE)]*(self.SIZE)
        #self._solutions = []
        print self.puzzle
        print self._solutions
        for i in range(self.SIZE):
            #self._solutions.append([])
            for j in range(self.SIZE):
                if self.puzzle[i][j] < 1:
                    #self._solutions[i][j] = set(range(1,self.SIZE+1))
                    self._solutions[i][j] = 1
                    #self._solutions[i].append(1)
                    self._empty_cells += 1
                    print "puzzle[%s][%s] = %s\tsolutions[%s][%s] = %s" % (i,j, self.puzzle[i][j], i, j, self._solutions[i][j])
        print self._solutions
def\uuuu init\uuuu(self,N=3,puzzle=None):
self.N=N
self.SIZE=self.N*self.N
self.puzzle=[[set([1])]*(self.SIZE)]*(self.SIZE)
如果谜题为“无”:
对于范围内的i(自身尺寸):
self.puzzle[i]=[int(k)表示原始输入()中的k]
其他:
self.puzzle=[[int(k)表示行中的k]表示行中的puzzle.splitlines()]
self.\u空\u单元格=0
self._solutions=[[0]*(self.SIZE)]*(self.SIZE)
#自我解决方案=[]
打印自我拼图
打印自我解决方案
对于范围内的i(自身尺寸):
#self.\u solutions.append([])
对于范围内的j(自身尺寸):
如果self.puzzle[i][j]<1:
#self._解[i][j]=集合(范围(1,self.SIZE+1))
自解[i][j]=1
#self.\u解决方案[i].附加(1)
自身。_空_单元格+=1
打印“拼图[%s][%s]=%s\t解决方案[%s][%s]=%s”%(i,j,self.puzzle[i][j],i,j,self.\u解决方案[i][j])
打印自我解决方案
我考虑的是如何设置
self.\u solution
的值。理想情况下,这两种方法都应该工作得最好,但是这两种方法的输出差别很大。我只希望满足条件
self.puzzle[I][j]==0的位置设置为1。然而,在方法2中,
self.\u solution
的所有值都设置为1,而方法1工作正常

同样在方法2中,如果我只是在
if self.puzzle[I][j]==0
条件后添加一个else块,然后设置
self.\u solution[I][j]=0
的值,则输出是正确的

有人能解释这种奇怪的行为吗。还有其他人也看到过类似的结果吗

我正在使用iPython和Python 2.7

编辑:它不是的副本,因为正如@Crazy Casta所指出的,这一个处理*操作符。我还发现我有这样的情况:
self.\u solutions=[[set([])]*SIZE]*SIZE
更危险,因为每个创建的集合元素都指向内存中的同一元素

有很多东西需要理解,但我猜你在这方面遇到了麻烦:

self._solutions = [[0]*(self.SIZE)]*(self.SIZE)
假设您试图做的是创建独立的SIZE
self.SIZE
列表,那么您就得不到想要的。您正在使用的列表乘法语法复制引用,因此您有一个对同一列表的
self.SIZE
引用列表。你想要的是:

self._solutions = [[0]*(self.SIZE) for _ in range(self.SIZE)]

这将创建一个新的列表
self.SIZE
次,而不是重复使用同一个列表。

可能重复@NightShadeQueen,我不同意。这个问题与列表上的*操作符无关,这就是问题所在。