作为大学练习的一部分,我们通过Python采用入门编程语言。我已经知道如何编程达到合理的标准,所以我被告知如果我能提供一些高质量的东西,我可以跳过一些课程。
在这种程度上,我已经使用了文本游戏“星际迷航”(http://www.dunnington.u-net.com/public/startrek/startrek.c)的C版本,并在Python中重写了它,当我习惯了Python的特定要求时,这已经足够了。
我的问题似乎是Stackoverflow上常见的问题,它是一个可用的多维数组的创建和使用。经过多次搜索,我已经掌握了创建整数或字符串等多维列表的问题,但是当谈到类的多维数组(或列表,确切地说)时,所有的地狱都会崩溃。
这是我的班级:
class quadrant:
klingonCount = 0
baseHere = 0
starCount = 0
这是创建类列表列表的众多尝试之一:
quadrants = [quadrant] * 9
for y1 in range(1,9):
quadrants[y1] = [quadrant] * 9
这是从http://docs.python.org/2/faq/programming#how-do-i-create-a-multidimensional-list
复制的当我将一个类替换为0时,打印数组显示整个数组引用了一个类,而不是很多不同的类,正如我所希望的那样。
问题是数组只保存在循环的最后一次迭代中输入的值,而不是单个数组。
我不是100%熟悉类的使用,所以我可能只是尝试多次引用一个类,我实际上需要很多类。我呢?救命啊!
我正在使用Python 2.7,这是推荐的语言。
为了便于参考,这是尝试填充多维列表的代码:
for x in range(1,9):
for y in range(1,9):
j = randint(1,99)
if (j < 5):
numBases += 1
baseHere = 1
temp = getKlingons(difficulty)
klingonsHere += temp
quadrants[x][y].baseHere = baseHere
quadrants[x][y].klingonCount = temp
s = randint(1,9)
quadrants[x][y].starCount = s
答案 0 :(得分:2)
问题来自这样一个事实:您创建了一个具有类属性的类,而不是实例属性。稍后,在迭代期间,您创建的实例属性实际上与类属性无关。这真的没有意义。
你的课应该是这样的:
class Quadrant(object):
def __init__(self):
self.klingonCount = 0
self.baseHere = 0
self.starCount = 0
你可以像这样创建数组:
quadrants = [[Quadrant() for i in range(8)] for j in range(8)]
在您的解决方案中,一行中的所有列表都包含相同的对象。因此,在每次迭代中,您都要修改相同的3个属性。
另请注意,列表具有从0开始的索引,因此您应该像这样迭代:
for x in range(9):
for y in range(9):
#...
答案 1 :(得分:0)
你的错误在于引用一个类,而不是该类的实例。
x = quadrant
print x
...会返回类似<class '__main__.quadrant'>
的内容,因为它引用类,而不是该类的对象。
这就是你如何制作该类的对象:
x = quadrant()
print x
..将打印类似<__main__.quadrant object at 0x0000000003263828>
试试这个:
quadrants = [[quadrant() for i in range(0,9)] for j in range(0,9)]
另外,也许可以考虑一个更简单的程序? Cymons的游戏有一堆更简单的程序来展示你对Python的理解: