运行此代码时,我从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
答案 0 :(得分:6)
这个错误意味着python尝试在tileType = map[x][y].tileType
中获取变量名称“map”,但是他没有找到任何位置,所以它在函数map中获取构建,这是不可取消的,因为它是一个内置函数,解释错误消息:
TypeError: 'builtin_function_or_method' object is unsubscriptable
我建议你首先将变量名称从“map”更改为不影响任何内置函数的内容,然后当你更改变量名时应该有NameError
错误,因为你的变量没有定义,所以你应该修复它。
希望我做对了,希望这有帮助:)
答案 1 :(得分:1)
当我提供MAP_WIDTH
,MAP_HEIGHT
,noise2d
和libtcod.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
指的是全局内置函数map
。 map = ...
中的make_map
部分仅创建一个局部变量,该函数在函数返回时死亡,对任何其他函数都不可见。只需在return map
末尾make_map
并将其存储在某个地方render_all
就可以访问它,或者(甚至更好)将其作为参数传递给render_all
。
请注意,通常不应该遮蔽内置名称,即不要将任何内容命名为map
或filter
或any
或......
此外,当迭代列表或任何其他序列(并且您不需要实际重新分配存储在其中的对象)时,请使用:
for row in rows:
for obj in rows:
... # use obj