2015-04-05 150 views
-1

当我运行我的代码构建完美的迷宫时,出现此错误。 下面是代码:i = self._randbelow(len(seq))TypeError:'NoneType'类型的对象没有len()

def walk(self, s, x, y): 

     neighboor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)] 

     if s.size() == self.size**2: return 

     else: 

      while True: 
       new = choice(neighboor) 
       if self.is_valid(new[0], new[1]): break 

      while self.maze[new[0]][new[1]].getVisit(): 

       if len(neighboor) != 0: new = choice(neighboor.remove(new)) 
       else: 
        temp = s.pop(s) 
        self.walk(s, temp[0], temp[1]) 

      #print(new) 

      self.maze[new[0]][new[1]].changeVisit() 
      if new == neighboor[1]: 
       self.maze[x][y].changeNorth() 
       self.maze[new[0]][new[1]].changeSouth() 
      elif new == neighboor[0]: 
       self.maze[x][y].changeSouth() 
       self.maze[new[0]][new[1]].changeNorth() 
      elif new == neighboor[2]: 
       self.maze[x][y].changeEast() 
       self.maze[new[0]][new[1]].changeWest() 
      elif new == neighboor[3]: 
       self.maze[x][y].changeWest() 
       self.maze[new[0]][new[1]].changeEast() 


      s.push(new) 

      self.walk(s, new[0], new[1]) 

这是我得到的错误:

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    a.search() 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 93, in search 
    self.walk(s, startX, startY) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 76, in walk 
    self.walk(s, new[0], new[1]) 
    File "C:\Users\Serena\Desktop\XAproject\Stack.py", line 52, in walk 
    if len(neighboor) != 0: new = choice(neighboor.remove(new)) 
    File "C:\Python34\lib\random.py", line 253, in choice 
    i = self._randbelow(len(seq)) 
TypeError: object of type 'NoneType' has no len() 

我觉得“neighboor”是一个列表包含四组数字,它应该有LEN()。

我是新手编程,任何帮助将不胜感激。

+0

X,y只有两个int代表坐标。 – 2015-04-05 04:26:52

+0

Aside - 这里neighboor的拼写其实是[邻居或邻居](http://simple.wikipedia.org/wiki/Neighbour) – 2015-04-05 04:38:12

回答

4

几件事情。首先,如果您使用从通配符导入(从随机导入*)导入的类似choice()的东西,那么包含它会很有用,因为否则我们只是猜测您从哪里获取该函数。另外,wildcard imports are considered bad practice anyway

问题是列表的remove()方法返回None。你不能从None中选择一些,因为None不是可迭代的。也就是说,remove()方法不支持链接。 尝试改变:

if len(neighboor) != 0: new = choice(neighboor.remove(new)) # Passes None to choice() which raises an error 

if len(neighboor) != 0: 
    neighboor.remove(new) # removes the element from neighboor 
    new = choice(neighboor) # Chooses from the list as you intended 

你可以有其他错误,但是这是从您发布的回溯附带的一个。对于将来,我建议您熟悉Python的回溯,因为它告诉你到底发生了什么问题。 Here's a resource

顺便说一句,你是指邻居而不是邻居吗?

+0

挑剔,但它'选择'不一定要从通配符导入,它可能已经从'随机导入选项'中导入。 – mhawke 2015-04-05 04:45:55

+0

够公平的。我不打算编辑它,因为我喜欢分享一般应避免通配符导入,我仍然认为关于它的观点更难以看出发生了什么是有效的。 – Gustav 2015-04-05 04:52:29

+0

thx〜会通过资源 – 2015-04-05 04:59:48

相关问题