python - Python中的二维列表重复随机数赋值

标签 python python-3.x memory arraylist reference

抱歉,我确信这个问题以前出现过,但似乎没有一个例子适用。

我正在尝试创建一个二维列表(4 x 100),它在每一行的不同范围内分配随机值。

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

输出只是为二维列表的每一行显示相同的一组数字...

输出:

29
21
2
0

29
21
2
0

我是 python 的新手,我知道我一定遗漏了一些基本的东西,但经过大量的思考和啊哈之后我还没有弄清楚,任何帮助都将不胜感激。

谢谢

最佳答案

通过使用 [[0] * 5] * no_of_flowers,您将创建 100 个对同一列表的引用。这意味着内存中只有ONLY ONE ROW

当您修改一行时,如果影响内存中的行,并且由于所有其他“行”引用它,它们将简单地使用内存中的最新列表。

要避免这种情况,您可以使用:

flower = [[0 for _ in range(5)] for _ in range(no_of_flowers)]

你可以找到一个 example and explanation in wtfpython :

# Let's initialize a row
row = [""]*3 #row i['', '', '']
# Let's make a board
board = [row]*3

输出:

>>> board
[['', '', ''], ['', '', ''], ['', '', '']]
>>> board[0]
['', '', '']
>>> board[0][0]
''
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['X', '', ''], ['X', '', '']]

解释:

当我们初始化 row 变量时,这个可视化解释了内存中发生的事情。

enter image description here

board 通过乘以 row 进行初始化时,这就是内存中发生的事情(每个元素 board[0]board[1]board[2] 是对 row 引用的同一列表的引用)

enter image description here

我们可以通过不使用row 变量来生成board 来避免这种情况。 (在 this 问题中提出)。

>>> board = [['']*3 for _ in range(3)]
>>> board[0][0] = "X"
>>> board
[['X', '', ''], ['', '', ''], ['', '', '']]

关于python - Python中的二维列表重复随机数赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262858/

相关文章:

python - 为什么 max(iterable) 的执行速度比等效循环慢得多?

python - TensorFlow GPU 无法运行,如何安装?

python - 来自 numpy 操作的 numpy.memmap

C Memory free in loop error -> 大小为 1 的无效读取

c - 循环缓冲区的结束指针问题

python - Matplotlib:如何增加热图中 bin 的大小(hexbin)?

python - 在单行列表理解中操作字典列表

python - 获取 Tkinter 条目小部件的内容

python - 如何在Python中将列表的列表转换为组?

python - 三角形/几何彩虹螺旋