TypeError:'builtin_function_or_method'对象是不可取消的

时间:2011-03-20 14:55:39

标签: python

运行此代码时,我从Python解释器中收到一个奇怪的错误:

def make_map():
    map = [[Tile(0, 0) for col in range(MAP_WIDTH)] for row in range(MAP_HEIGHT)]

    for x in range(MAP_WIDTH):
        for y in range(MAP_HEIGHT):     
            map[x][y].tileType = round((libtcod.noise_perlin(noise2d,[y/MAP_WIDTH,x/MAP_HEIGHT])*100), 0)

它在终端返回:

TypeError: 'builtin_function_or_method' object is unsubscriptable 

回溯也指向此功能:

def render_all():
    global color_light_wall
    global color_light_ground

    #go through all tiles, and set their background color
    for y in range(MAP_HEIGHT):
        for x in range(MAP_WIDTH):
            tileType = map[x][y].tileType
            if tileType>30:
                libtcod.console_set_back(con, x, y, color_dark_wall, libtcod.BKGND_SET )
            else:
                libtcod.console_set_back(con, x, y, color_dark_ground, libtcod.BKGND_SET )

    #draw all objects in the list
    for object in objects:
        object.draw()

    #blit the contents of "con" to the root console
    libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0)

我认为他们都与这一行有关:tileType = map[x][y].tileType但如果有人可以对此有所了解,我会很感激。

谢谢,Elliot Bonneville

编辑:我忘了包含我的Tile类代码和完整的回溯:

class Tile:
    #a tile of the map and its properties
    def __init__(self, tileType, blocked):
        self.tileType = tileType
        self.blocked = blocked

回溯:

  File "kindred.py", line 123, in <module>
    render_all()
  File "kindred.py", line 64, in render_all
    tileType = map[x][y].tileType
TypeError: 'builtin_function_or_method' object is unsubscriptable

4 个答案:

答案 0 :(得分:6)

这个错误意味着python尝试在tileType = map[x][y].tileType中获取变量名称“map”,但是他没有找到任何位置,所以它在函数map中获取构建,这是不可取消的,因为它是一个内置函数,解释错误消息:

TypeError: 'builtin_function_or_method' object is unsubscriptable 

我建议你首先将变量名称从“map”更改为不影响任何内置函数的内容,然后当你更改变量名时应该有NameError错误,因为你的变量没有定义,所以你应该修复它。

希望我做对了,希望这有帮助:)

答案 1 :(得分:1)

当我提供MAP_WIDTHMAP_HEIGHTnoise2dlibtcod.noise_perlin的定义时,我的make_map函数不会失败。 (但是 - 虽然我确定这与你得到的错误无关 - 你需要以map[y][x]而不是map[x][y]来访问数组,因为它是一个行列表,不是列。

当然Python有一个map内置函数。您提供的代码实际上是字面上代码中的代码,或者(例如)map在一个地方设置然后在另一个地方使用?因为如果由于某种原因,当您开始尝试引用map时,map[x][y].tileType超出了范围,那么您将获得内置函数map,这将产生您列出的排序错误

顺便说一句,因为 Python具有内置功能,所以首先调用其中一个变量map可能不好。

答案 2 :(得分:0)

您有名称冲突,此处使用内置map()方法。

答案 3 :(得分:0)

正如其他人所猜测的那样,map中的render_all指的是全局内置函数mapmap = ...中的make_map部分仅创建一个局部变量,该函数在函数返回时死亡,对任何其他函数都不可见。只需在return map末尾make_map并将其存储在某个地方render_all就可以访问它,或者(甚至更好)将其作为参数传递给render_all

请注意,通常不应该遮蔽内置名称,即不要将任何内容命名为mapfilterany或......

此外,当迭代列表或任何其他序列(并且您不需要实际重新分配存储在其中的对象)时,请使用:

for row in rows:
    for obj in rows:
        ... # use obj