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)
类Cell应该作为输入传递变量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
如果这有帮助,那么到目前为止,who项目的代码......
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()
答案 0 :(得分:1)
您遇到的问题与您在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 = [[] for _ in range(self.mpsiz[1])]
构建列表列表。这将为range
中的每个值创建一个单独的空内部列表,因此打印出位置的索引将按预期工作。
注意,您的代码中也存在另一个外围问题。您使用Map
来表示类的名称及其实例(因为您执行Map = Map()
)。这可能不是一个好主意!