如何在Python中随机填充列表列表?

时间:2016-07-28 18:04:17

标签: python python-3.x

我一直在尝试制作一款探索游戏,所以很自然地我开始使用世界发电机。然而,我被困在填充我的生物群系列表中。 " 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']]

3 个答案:

答案 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))
相关问题