0

作为大学练习的一部分,我们将通过 Python 作为介绍性编程语言进行学习。我已经知道如何按照合理的标准进行编程,所以有人告诉我,如果我能展示一些高质量的东西,我可以跳过这门课。

就此而言,我采用了文本游戏 Star Trek ( 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
4

2 回答 2

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):
        #...
于 2013-11-14T09:43:10.187 回答
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 的理解:

http://cymonsgames.com/category/programs/

于 2013-11-14T09:55:18.830 回答