我有一个以矩阵样式存储列表列表的类,它可以像[x,y]一样编入索引。
现在我有这些设置:
test_dict = {1:"cow",2:"horse"}
randommap = mapArray(None, (20,20))
随机地图只填充了1的列表。所以任何索引都会返回1.但是这里是我迷路的地方,可能是因为对字典的工作方式存在误解:
test_dict[1]
这显然是回归“牛” 和
randommap[1,1] #or any two x,y values up to 20 for that matter
给我的值为1。
但是为什么这会给我一个关键错误:
test_dict[randommap[1,1]]
在单独的情况下,索引randommap会给我一个值1,所以不应该将1作为test_dict的索引提供,从而返回“cow”?
更新: 这些是我认为导致问题的两种方法。看来他们正在返回字符串而不是整数,但我不知道如果我完全理解两者之间的区别。
def __str__(self):
return str(self.mapdata)
def __repr__(self):
return str(self.mapdata)
以下是重载的__getitem__
方法:
def __getitem__(self, (x,y)):
#Just reverses it so it works intuitively and the array is
# indexed simply like map[x,y] instead of map[y][x]
return mapArray(self.mapdata[y][x])
抱歉,格式化似乎已经搞砸了。
答案 0 :(得分:1)
1
(和整数),"1"
(一个字符串)和__repr__()
方法在调用时返回字符串"1"
的任何自定义类之间存在差异。它们都将在控制台中以1
打印,但不等同于dict查找。
您需要检查type(randommap[1, 1])
确实是int
。
更新:您的__getitem__
方法不返回整数,它会返回mapArray
类的新实例。你的意思是只返回价值观吗? E.g:
def __getitem__(self, (x,y)):
#Just reverses it so it works intuitively and the array is
# indexed simply like map[x,y] instead of map[y][x]
return self.mapdata[y][x]
答案 1 :(得分:0)
鉴于更新的问题,似乎__getitem__
返回一个新的mapArray。
我认为您的重载__getitem__
应该类似于
def __getitem__(self, (x,y)):
return self.mapdata[y][x]
相反,(假设[y] [x]顺序是故意的)。