很抱歉,因为我确信这个问题以前就出现过,但这些例子似乎都不适用。在
我正在尝试创建一个2D列表(4x100),它在每一行的不同范围内分配随机值。在
import random
size_of_meadow = 100
no_of_flowers = 100
no_of_flower_types = 3
flower = [[0] * 5] * no_of_flowers
for row in range(no_of_flowers):
flower[row][0] = random.randint(0, size_of_meadow - 1) # x coord
flower[row][1] = random.randint(0, size_of_meadow - 1) # y coord
flower[row][2] = random.randint(1, no_of_flower_types)
if random.randint(0, 100) < 5:
flower[row][3] = 1
else:
flower[row][3] = 0
print(flower[0][0])
print(flower[0][1])
print(flower[0][2])
print(flower[0][3])
print(" ")
print(flower[1][0])
print(flower[1][1])
print(flower[1][2])
print(flower[1][3])
# Sorry the above isn't in a for loop
输出只是显示2D列表中每一行的相同的一组数字。。。在
输出:
^{pr2}$我是python新手,我知道我一定遗漏了一些基本的东西,但是在经过了大量的思考和思考之后,我还没有弄明白,任何帮助都是非常感谢的。在
谢谢
你有一个列表包含100倍的相同列表
更好的解决方案是
^{pr2}$不过,造花机会更好
嘿@李说得对,但让我详细说明一下
在这里您可以看到每个子列表都指向内存中的相同位置
我会用这个方法:
^{pr2}$通过使用
[[0] * 5] * no_of_flowers
,您将创建对同一列表的100个引用。这意味着内存中只有一行。在当您修改一行时,如果影响内存中的行,并且因为所有其他“行”都引用它,那么它们只会使用内存中最新的列表。在
为了避免这种情况,您可以使用:
您可以找到一个example and explanation in wtfpython:
^{pr2}$输出:
说明:
当我们初始化
row
变量时,这个可视化解释了内存中发生的事情。在当}中的每个元素都是对
board
通过乘以row
来初始化,这就是内存中发生的情况(元素board[0]
、board[1]
和{row
所引用的相同列表的引用)我们可以通过不使用
row
变量来生成board
来避免这种情况。(在this期中提出)。在相关问题 更多 >
编程相关推荐