为什么我的列表在进入循环时没有改变?

时间:2014-05-13 07:48:15

标签: python list class oop matrix

我试图在我的Class Circle中构建一个函数绘制,它获得一个由列表列表表示的矩阵,它有m行和n列,并且在每个单元格中都有0,(i, j)单元格表示(i,j)点,该函数应将给定圆中包含的每个(i,j)单元格更改为一个。

示例:

>>> mat =[[0 for j in range(5)] for i in range(7)] 
>>> mat 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 
0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
>>> Circle(40,10,1).draw(mat) 
>>> mat 
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1, 
0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

这是我写的代码:

import math


class Point():
    """ Holds data on a point (x,y) in the plane """

    def __init__(self, x=0, y=0):
        assert isinstance(x,(int, float)) and isinstance(y,(int, float)) 
        self.x = x
        self.y = y




class Circle():
    """ Holds data on a circle in the plane """

    def __init__(self,*args):
        if len(args)==2:
            if isinstance(args[0],Point) and isinstance(args[1],(float,int)):
                assert args[1]>0
                self.center= args[0]
                self.radius= args[1]

        if len(args)==3:
            assert args[2]>0
            self.a=args[0]
            self.b=args[1]
            self.center= Point(self.a,self.b)
            self.radius= args[2]



    def contains(self,check): 

        if isinstance(check,(Point)):
            if math.sqrt((self.center.x-check.x)**2 + (self.center.y-check.y)**2) <= self.radius:
                return True
        if isinstance(check,Circle): 
            test= math.sqrt((self.center.x-check.center.x)**2 + (self.center.x-check.center.x)**2)
            if test < (abs((self.radius)-(check.radius))):
                return True

        else:
            return False

    def intersect(self,other):  
        check= math.sqrt((self.center.x-other.center.x)**2 + (self.center.y-other.center.y)**2)
        if check >(self.radius+other.radius):
            return False
        if check < (self.radius+other.radius):
            return True


    def draw(self,mat):
        for lst in mat:
            for j in lst:
                if Circle.contains(self,(lst,j)):
                    mat[lst[j]]=1

1 个答案:

答案 0 :(得分:0)

我找到了你的错误!首先我在你的代码中添加一个打印,如下所示:

def draw(self,mat):
    for lst in mat:
        for j in lst:
            if Circle.contains(self,(lst,j)):
                print 'it is ok'
                mat[lst[j]]=1

运行它,你会发现代码print 'it is ok'永远不会运行。它告诉我们你的判决总是错误的。

我检查了你的Circle.contains(self,(lst,j))函数,你的参数就像([0,0,...],j),而你的函数想要的只是一个Point或Circle,所以它永远不会返回True。

我想修复你的代码,但我认为你的垫子有问题,所以这只是一些建议。你还需要两次考虑你的目的!