类型错误:“builtin_function_or_method”对象是unsubscriptable

问题描述:

我越来越从Python解释一个奇怪的错误,当我运行此代码:类型错误:“builtin_function_or_method”对象是unsubscriptable

TypeError: 'builtin_function_or_method' object is unsubscriptable 

的:

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) 

它在终端返回该回溯也指向这个功能:

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但是如果有人能够阐明这一点,我会很感激。

感谢,埃利奥特博纳维尔

编辑:我忘了,包括我的瓷砖类代码和完全回溯:

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 
+0

请提供*全*回溯,而不是回迹片段 - 它们是完全没有帮助 – 2011-03-20 14:59:44

+0

好了,对不起。编辑。 – 2011-03-20 15:00:13

+0

好吧,显然'map'包含“内置函数或方法”而不是'Tile'对象。我们无法通过您展示的代码告诉您为什么或者发生了什么。尝试'print repr(map)',并发布输出(或者输出的一个片段,如果它很大的话)。 – delnan 2011-03-20 15:01:33

这个错误意味着python试图在tileType = map[x][y].tileType中获得一个变量名“map”,但是他没有找到它,因此它在函数map中找不到它,因为它是一个内置函数,可以解释错误信息:

TypeError: 'builtin_function_or_method' object is unsubscriptable 

什么,我会告诉你的是首先从“地图”改变你的变量名到任何不影子任何内置的功能,第二时,你会改变你的变量名,你应该有一个NameError错误,因为你的变量没有定义,所以你应该修复这个问题。

希望我得到它的权利,并希望这种帮助:)

+0

这是错误。感谢您的帮助,奇点! – 2011-03-20 15:17:01

+0

@Elliot:很高兴我能够帮助:) – mouad 2011-03-20 21:24:26

你make_map功能不会失败我提供的定义为MAP_WIDTH,MAP_HEIGHT,noise2dlibtcod.noise_perlin。 (但是 - 虽然我确信这与您遇到的错误无关 - 您需要访问阵列map[y][x],而不是map[x][y],因为它是行列表,而不是列。当然,Python有一个map内置函数,你提供的代码真的是字面上代码中的代码,或者(例如)map设置在一个地方,然后在另一个地方使用?因为如果由于某种原因,你的map超出了范围你开始试图引用map[x][y].tileType,那么你会得到内置函数map,而这会产生你列出的排序错误。

顺便提一句,因为 Python有内置的功能,首先调用其中一个变量map的方式可能是不好的风格。

+0

啊。我不知道Python已经内置了一个map函数。让我检查一下,看看你提出的是什么问题。 – 2011-03-20 15:11:35

+0

足够有趣,指出我需要访问地图[y] [x]解决了第一个问题,当第一个问题被修复时,弹出第二个问题。 :) Upvoting。 – 2011-03-20 15:18:00

你有一个名称冲突和内置的地图()方法被用在这里。

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

注意,一般不宜阴影内置的名称,即不姓什么mapfilterany或...

而且,在一个列表或任何其它序列迭代(和你的时候不要“T需要真正的重新分配存储在它的对象),使用:

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