我正在尝试使用python制作一个2d地图生成算法,这些类不会接受我提供的输入?

我正在尝试使用python制作一个2d地图生成算法,这些类不会接受我提供的输入?,python,Python,类单元格应传递变量X和Z作为输入,但这是print语句的结果 0 0 [0, 1, 0] 但是当x数字变为1时,它就会打印出来 1, 0 [0,1,0] 下面是Cell()的类代码 如果这有帮助的话,这是世卫组织项目迄今为止的代码 class Cell(object): def __init__(self, x, y, z, v): self.pos = [x, y, z] self.value = v 您遇到的问题与如何在map类中创建map属性有关。

类单元格应传递变量X和Z作为输入,但这是print语句的结果 0 0 [0, 1, 0] 但是当x数字变为1时,它就会打印出来 1, 0 [0,1,0]

下面是Cell()的类代码

如果这有帮助的话,这是世卫组织项目迄今为止的代码

class Cell(object):
    def __init__(self, x, y, z, v):
        self.pos = [x, y, z]
        self.value = v

您遇到的问题与如何在
map
类中创建
map
属性有关。您正在使用的代码不是您想要的。您得到的不是一个独立列表的列表,而是一个包含许多对同一内部列表的引用的列表。这是因为
some_list*some_integer
不会复制
some_list
中的值,它只是重复对现有项的引用。对于像数字这样的不可变值,这很好。但是对于可变值(如列表),当您稍后尝试更改值时会遇到问题

您看到所有项目的
x
值相同的原因是您正在查找
self.map[x][z]
。由于所有的
self.map[x]
值都是相同的列表(无论您使用了什么
x
),因此您只能看到附加到列表中的第一组值。其他的都是创建的,但它们还很长(你可以通过
self.map[0][x*self.mpsiz[1]+z]
找到它们)

不要使用
self.map=[[]*self.mpsiz[0]]*self.mpsiz[1]
来构建列表列表,请尝试使用
self.map=[[]来表示范围内的(self.mpsiz[1])]
。这将为
范围
中的每个值创建一个单独的空内部列表,因此打印位置的索引将按预期工作


注意,代码中还存在另一个外围问题。您正在使用
Map
,既用于类的名称,也用于类的实例(因为您使用了
Map=Map()
)。那可能不是个好主意

我不确定这是否是您的问题的根源,但您显示的代码的第一行,
self.map=[[[]*self.mpsiz[0]]*self.mpsiz[1]
,几乎肯定不能满足您的要求。这是在创建一个列表,其中引用了同一个空列表(内部乘法没有任何用处)。您可能希望
[[]用于范围内的uuu(self.mpsiz[1])]
或者
[[None]*self.mpsiz[0]用于范围内的uuu.mpsiz[1]]
(后者要求您以后不要
附加到列表中,而是分配到列表中,替换现有的
值)。谢谢您让我知道,关于内部乘法,但这并没有解决问题…我非常感谢您的帮助。感谢您对问题的解释,这非常有帮助!,在你的帮助下,我解决了这个问题!
class Cell(object):
    def __init__(self, x, y, z, v):
        self.pos = [x, y, z]
        self.value = v
import random as rand
class Cell(object):
    def __init__(self, x, y, z, v):
        self.pos = [x, y, z]
        self.value = v

class Map(object):
    def __init__(self):
        self.map = None
        self.mpsiz = [None, None, None]
        self.cell = None
        self.cell1 = None
    def generate_map(self):
        self.fills_nones()

    def fills_nones(self):
        self.mpsiz = [input('How long should the x be? (default is 500 * 500) ') or 500,
                  input('How far should it be in the z dir ') or 500,
                  None]
        for i in range(len(self.mpsiz)-1):
            self.mpsiz[i] = int(self.mpsiz[i])
        self.map = [[]*self.mpsiz[1]]*self.mpsiz[0]
        print(self.mpsiz)
        print('Beginning map generation')
        print('Beginning the base map generation')
        self.make_base()

    def make_base(self):
        self.map = [[]*self.mpsiz[0]]*self.mpsiz[1]
        print(self.map)
        for x in range(self.mpsiz[0]):
        for z in range(self.mpsiz[1]):
            print(x, z)
            self.map[x].append(Cell(x, 1, z, rand.randint(0, 1)))
            print(self.map[x][z].pos)
        print('Done!')
        print('Beginning the rule runs')
        self.make_full_map()

    def make_full_map(self):
        for x in range(self.mpsiz[0]):
            print('\n')
            for z in range(self.mpsiz[1]):
                print(self.map[x][z].pos)


Map = Map()
Map.generate_map()