IndexError:列表索引超出范围/难以使用OOP调用列表

时间:2014-07-23 02:05:59

标签: python oop

我是编码的新手,并且通过“学习Python艰难的方式”教授自己的python'教程,我正在制作一个简单的游戏。到目前为止,一切似乎都在起作用,除了我无法弄清楚如何正确地调用我的类与其他类之一的列表。

class engine(object):
    def __init__(self,world,days,character):
        self.world = world
        self.days = days
        self.character = character

    def letsdoit(self):
        self.world.worldbuilder()

这是实际运行游戏的区块,第9行以后被省略,因为它们并不相关。

world.worldbuilder是创建实际播放游戏的地图的功能。

class World(self, width, height):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def worldbuilder(self):
        map = []
        for x in xrange(self.width):
            z = []
            for y in xrange(self.height):
                z.append(self.tiletype())
            map.append(z)
        return map

World.tiletype只是随机生成一个磁贴然后重置。当我实例化一个World的对象并运行worldbuilder时(除了我打印地图而不是返回它)它完全正常。然而,当我在猜想中使用除了World之外的对象来引用map时,我会遇到错误。最常见的是:

IndexError: list out of range

具体来说,我得到它以回应:

class player(object):
    def __init__(self, World):
        self.x = randint(1,World.width)
        self.y = randint(1,World.height)
        self.tilestore = map([self.x][self.y])

即使我将player.tilestore设置为等于通用磁贴,我也会遇到TypeErrors,它说的是我的' built_in_function_or_method' item没有属性' get_item'当我在其他地方提到地图时。

我尝试过设置list = self.world.worldbuilder(),然后调用list而不是map,但后来我遇到了完全相同的问题。

2 个答案:

答案 0 :(得分:0)

IndexError是由不正确的列表索引语法引起的,而TypeError是由命名空间冲突引起的。要修复IndexError,您应该使用以下语法:

self.tilestore = world_map[self.x][self.y]

TypeError是由命名空间冲突引起的。在player.init您正在使用变量map而不在本地命名空间中初始化map,因此map引用全局命名空间,其中包含对内置{{1}的引用1}}功能。您需要将map作为参数传递给map,如此

player.init

或从class player(object): def __init__(self, world, map): 这样的实例中获取

World

您应该像我上面所做的那样,将参数class player(object): def __init__(self, world): self.x = randint(1,world.width) self.y = randint(1,World.height) self.tilestore = world.map([self.x][self.y]) 更改为World,以避免在类名world和类的实例之间发生另一个名称空间冲突, World

导致World的另一个问题是您使用IndexError。假设您使用random.randint函数,对于参数randinta,它会生成b的数字。请注意,此范围包括双方。这意味着有时a <= N <= b等于self.xworld.width等于self.y。由于您构建world.height的方式,这两个值都超出了范围。这是修复:

world.map

在索引世界地图的任何地方,您都必须进行类似的更改。

答案 1 :(得分:0)

您似乎没有拨打worldbuilder,所以也许您可以在使用map之前调用它:

class player(object):
    def __init__(self, World):
        self.x = randint(1,World.width)
        self.y = randint(1,World.height)
        map = World.worldbuilder()
        self.tilestore = map[self.x][self.y]

正如Brionius所提到的,使用map是一个坏主意(除非你想使用内置函数)。这会导致误导性错误消息。 对类和实例使用相同的名称(World)也很糟糕。