首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"TypeError:'NoneType‘类型的参数不能迭代“?

"TypeError:'NoneType‘类型的参数不能迭代“?
EN

Stack Overflow用户
提问于 2016-04-30 09:13:13
回答 2查看 10.4K关注 0票数 0

这是我的代码,这是一个棋盘游戏。我不知道为什么我会犯这个错误:

TypeError:类型'NoneType‘的参数是不可迭代的。

这个问题出现在move_tiger()函数中,但是我在move_goat()函数中使用了相同的代码,它工作得很好。请有人告诉我这个错误在我的例子中意味着什么,因为我不认为我在试图迭代move_tiger()函数中的任何内容。谢谢你的帮助。

代码语言:javascript
复制
class Board:

    def __init__(self): 
        self.board = dict()
        # a, b, c, d, and e are keys
        self.board['a'] = ['T']
        self.board['b'] = ['0','T','0','0','T','0']
        self.board['c'] = ['0','0','0','0','0','0']
        self.board['d'] = ['0','0','0','0','0','0']
        self.board['e'] = ['0','0','0','0']
        self.phase = 'add'
        self.numgoats = 0

    def print_board(self):
        for letter in 'abcde':
            for vertex in self.board[letter]:
                print vertex,
            print

    def content(self, position):
        row=list(position)[0]
        column=list(position)[1]
        return self.board[row][int(column)]

    def _set(self, position, value):
        self.board[position[0]][position[1]] = value

    def neighbors(self, position):
        if position == ('a',0):
            return [('b',1),('b',2),('b',3),('b',4)]
        # bunch of extraneous elif's that all return something skipped
        elif position == ('e',3):
            return [('e',2),('d',4)]

    def add_goat(self, position):
        if self.phase == 'add':
            if self.content(position) == '0':
                self._set(position, 'G')
                self.numgoats+=1
                if self.numgoats==3:
                    self.phase = 'move'

    def move_goat(self, old, new):
        if self.phase!='move':
            print "invalid move; try again"
        elif self.content(old) == 'G' and self.content(new) == '0' and new in self.neighbors(old):
            self.board[old[0]][old[1]] = '0'
            self.board[new[0]][new[1]] = 'G'
        else:
            print "invalid move; try again"

    def move_tiger(self, old, new):
        if self.content(old) == 'T' and self.content(new) == '0' and new in self.neighbors(old):
                self.board[old[0]][old[1]] = '0'
                self.board[new[0]][new[1]] = 'T'
        else:
            print "invalid move; try again"


myboard = Board()
myboard.print_board()
myboard.add_goat(('b',0))
myboard.print_board()
myboard.add_goat(('c',0))
myboard.print_board()
myboard.add_goat(('d',0))
myboard.print_board()
myboard.move_goat(('c',0),('c',1))
myboard.print_board()
myboard.move_goat(('c',1),('b',5))
myboard.print_board()
myboard.move_tiger(('b',4),('b',3))
myboard.print_board

此代码产生以下内容:

代码语言:javascript
复制
T
0 T 0 0 T 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
T
G T 0 0 T 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
T
G T 0 0 T 0
G 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
T
G T 0 0 T 0
G 0 0 0 0 0
G 0 0 0 0 0
0 0 0 0
T
G T 0 0 T 0
0 G 0 0 0 0
G 0 0 0 0 0
0 0 0 0
invalid move; try again
T
G T 0 0 T 0
0 G 0 0 0 0
G 0 0 0 0 0
0 0 0 0
Traceback (most recent call last):
  File "game2.py", line 110, in <module>
    myboard.move_tiger(('b',4),('b',3))
  File "game2.py", line 91, in move_tiger
    if self.content(old) == 'T' and self.content(new) == '0' and new in self.neighbors(old):
TypeError: argument of type 'NoneType' is not iterable
EN

回答 2

Stack Overflow用户

发布于 2016-04-30 09:25:38

在Python所有函数(和方法)都隐式返回None,除非它们在执行过程中到达显式return语句。您的neighbours方法似乎接收到没有被任何if-elif分支覆盖的position

尝试在else中添加一个neighbours分支,这样您就可以看到意外的position

代码语言:javascript
复制
def neighbors(self, position):
    if position == ('a',0):
        return [('b',1),('b',2),('b',3),('b',4)]
    elif position[0] == ('b',0):
        return [('b',1),('c',0),('c',1)]
    # ...
    else:
        raise ValueError(position)
票数 2
EN

Stack Overflow用户

发布于 2016-04-30 09:25:57

old值为("b", 4)时会发生异常,因为self.neighbors(old)返回None。我不确定完全理解您的代码是干什么的,但是也许您应该检查一下在neighbors方法中是否漏掉了一种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36952994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档