【问题标题】:Why my list is not changing when entering the loop?为什么进入循环时我的列表没有改变?
【发布时间】:2014-05-13 07:48:14
【问题描述】:

我正在尝试在我的 Class Circle 中构建一个函数 draw ,它获取一个由列表列表表示的矩阵,它有 m 行和 n 列,每个单元格中都有 0,(i,j) cell 表示 (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。
  • 进入循环?你甚至不调用该方法。其余代码在哪里?
  • 它应该将值更改为一个,但是当我运行我的代码并调用该方法时,列表根本没有改变! @thefourtheye

标签: python list class oop matrix


【解决方案1】:

我发现了你的错误!首先我在你的代码中添加一个打印,像这样:

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'永远不会运行。它告诉我们你的 if 语句总是错误的。

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

我想修复你的代码,但我认为你的垫子有问题,所以这只是一些建议。你仍然需要三思而后行!

【讨论】:

  • "for lst in mat:" 可以这样设计:"for i,lst in enumerate(mat):" then Circle.contains(self,(i,j)).
猜你喜欢
  • 2021-08-20
  • 2016-01-10
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多