我一直在尝试制作一款探索游戏,所以很自然地我开始使用世界发电机。然而,我被困在填充我的生物群系列表中。 " biome_map" list本质上是一个宽度和高度与用户请求的大小相等的数组。这是我写的代码:
EWbiome_map = [] #produces an empty row that is E_W_Size km wide
for chunk1 in range (1, (E_W_Size + 1)):
EWbiome_map = EWbiome_map + ["empty"]
biome_map = []
for chunk2 in range (1, (N_S_Size + 1)):
biome_map = biome_map + [EWbiome_map]
print ("Map Initialized")
print ("Assigning Biomes...") # produces an empty array
print (biome_map)
Seed1 = Seed
random.seed (Seed)
x = 0
for element in biome_map:
y = 0
for chunk3 in element:
(biome_map[x])[y] = random.choice (biome_list)
y = y + 1
x = x + 1
print ("Biomes Assigned")
print (biome_map)
错误显示在结果中,其中每个列表都是最后一个列表的副本。
Modules Successfully Imported
Biomes Initialized
Map Initialized
Assigning Biomes...
[['empty', 'empty', 'empty'], ['empty', 'empty', 'empty'],['empty', 'empty', 'empty']]
Biomes Assigned
[['tundra', 'tundra', 'plateaus'], ['tundra', 'tundra', 'plateaus'], ['tundra', 'tundra', 'plateaus']]
答案 0 :(得分:1)
创建EWbiome_map
时,您正在使用对同一列表biome_map
的引用。而是做类似的事情:
biome_map = [['empty']*E_W_Size]*N_S_Size
然而,您的整个代码可以简化为:
biome_map = [[random.choice(biome_list) for _ in range(E_W_Size)]
for _ in range(N_S_Size)]
答案 1 :(得分:0)
你的问题就在这一行
biome_map = biome_map + [EWbiome_map]
您正在使biome_map
成为列表,其中每个元素都是列表EWbiome_map
。请注意,每个元素都不是列表的副本,它是列表本身。要更正此问题,您需要EWbiome_map
列表的副本。一种方法是
biome_map = biome_map + [list(EWbiome_map)]
另一种方式是
biome_map = biome_map + [EWbiome_map[:]]
还有其他方法,但这些方法应该足够清楚。
为了澄清代码中发生的事情,请记住Python中的所有内容都是一个对象,一个对象在内部处理为指向对象数据存储位置的指针。将EWbiome_map
添加到biome_map
列表时,该列表实际上存储了指向EWbiome_map
的指针,而不是数据本身。因此,当您更改该数据的一次出现时,它将针对所有参考进行更改。
按list(EWbiome_map)
或EWbiome_map[:]
复制会生成一个包含自己的数据和指针的新列表。现在你可以改变其中一个而不影响其他人。
TL; DR 变量在Python中的处理方式与许多其他语言不同,因为一切都是对象。指针的使用范围比你想象的要广泛,但实现(通常)是隐藏的。
答案 2 :(得分:0)
正如其他答案所提到的那样,每次都引用相同的EWbiome_map,这会导致你在biome_map的所有行中改变它。
但是,您的代码也会执行许多不必要的操作,例如初始化空地图并使用> chunk3'和'元素'而不是直接使用x和y。
使用numpy并将该代码的全部替换为:
更快import numpy as np
biome_map = np.random.choice(biome_list,size=(N_S_Size,E_W_Size))