类型错误:“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
这个错误意味着python试图在tileType = map[x][y].tileType
中获得一个变量名“map”,但是他没有找到它,因此它在函数map中找不到它,因为它是一个内置函数,可以解释错误信息:
TypeError: 'builtin_function_or_method' object is unsubscriptable
什么,我会告诉你的是首先从“地图”改变你的变量名到任何不影子任何内置的功能,第二时,你会改变你的变量名,你应该有一个NameError
错误,因为你的变量没有定义,所以你应该修复这个问题。
希望我得到它的权利,并希望这种帮助:)
这是错误。感谢您的帮助,奇点! – 2011-03-20 15:17:01
@Elliot:很高兴我能够帮助:) – mouad 2011-03-20 21:24:26
你make_map功能不会失败我提供的定义为MAP_WIDTH
,MAP_HEIGHT
,noise2d
和libtcod.noise_perlin
。 (但是 - 虽然我确信这与您遇到的错误无关 - 您需要访问阵列map[y][x]
,而不是map[x][y]
,因为它是行列表,而不是列。当然,Python有一个map
内置函数,你提供的代码真的是字面上代码中的代码,或者(例如)map
设置在一个地方,然后在另一个地方使用?因为如果由于某种原因,你的map
超出了范围你开始试图引用map[x][y].tileType
,那么你会得到内置函数map
,而这会产生你列出的排序错误。
顺便提一句,因为 Python有内置的功能,首先调用其中一个变量map
的方式可能是不好的风格。
啊。我不知道Python已经内置了一个map函数。让我检查一下,看看你提出的是什么问题。 – 2011-03-20 15:11:35
足够有趣,指出我需要访问地图[y] [x]解决了第一个问题,当第一个问题被修复时,弹出第二个问题。 :) Upvoting。 – 2011-03-20 15:18:00
你有一个名称冲突和内置的地图()方法被用在这里。
正如其他人所猜测的,map
在render_all
指的是全局内置函数map
。 make_map
中的map = ...
部分仅创建局部变量,该函数在函数返回时死亡,并且对于任何其他函数都不可见。只需return map
在make_map
结束,并将其存储在某个地方render_all
可以访问它,或者(更好)将其作为参数传递给render_all
。
注意,一般不宜阴影内置的名称,即不姓什么map
或filter
或any
或...
而且,在一个列表或任何其它序列迭代(和你的时候不要“T需要真正的重新分配存储在它的对象),使用:
for row in rows:
for obj in rows:
... # use obj
请提供*全*回溯,而不是回迹片段 - 它们是完全没有帮助 – 2011-03-20 14:59:44
好了,对不起。编辑。 – 2011-03-20 15:00:13
好吧,显然'map'包含“内置函数或方法”而不是'Tile'对象。我们无法通过您展示的代码告诉您为什么或者发生了什么。尝试'print repr(map)',并发布输出(或者输出的一个片段,如果它很大的话)。 – delnan 2011-03-20 15:01:33